为了账号安全,请及时绑定邮箱和手机立即绑定

请问Java中的setter和getter的意义是什么?

请问Java中的setter和getter的意义是什么?

慕神8447489 2019-11-03 10:04:30
请原谅它的长度,但是这里有两个程序,两者完全相同,但是一个有一个没有setter,getter和构造函数的程序。我之前已经学过一个基本的C ++类,并且不记得其中的任何一个,而现在我没有看到它们的意义,如果有人可以用拉面的术语来解释它们,我将非常感激。目前,它们似乎不过是浪费空间,以使我的代码看起来更长,但老师说它们很重要(到目前为止,就是这样)。提前致谢!现在是代码:Mileage.java:package gasMileage;import java.util.Scanner; //program uses class Scannerpublic class Mileage {    public int restart;    public double miles, gallons, totalMiles, totalGallons, milesPerGallon;    public Mileage(int newRestart, double newMiles, double newGallons,                    double newTotalMiles, double newTotalGallons, double newMilesPerGallon)    {        setRestart(newRestart);        setMiles(newMiles);        setGallons(newGallons);        setTotalMiles(newTotalMiles);        setTotalGallons(newTotalGallons);        setMilesPerGallon(newMilesPerGallon);    }    public void setRestart(int newRestart)    {        restart = newRestart;    }    public int getRestart()    {        return restart;    }    public void setMiles(double newMiles)    {        miles = newMiles;    }    public double getMiles()    {        return miles;    }    public void setGallons(double newGallons)    {        gallons = newGallons;    }    public double getGallons()    {        return gallons;    }    public void setTotalMiles(double newTotalMiles)    {        totalMiles = newTotalMiles;    }    public double getTotalMiles()    {        return totalMiles;    }    public void setTotalGallons(double newTotalGallons)    {        totalGallons = newTotalGallons;    }    public double getTotalGallons()    {        return totalGallons;    }    public void setMilesPerGallon(double newMilesPerGallon)    {        milesPerGallon = newMilesPerGallon;    }    public double getMilesPerGallon()    {        return milesPerGallon;    }  
查看完整描述

3 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

无论哪种语言,getter和setter的目的都是隐藏基础变量。这样,您可以在尝试设置值时添加验证逻辑-例如,如果您有一个出生日期字段,则可能只希望将该字段设置为过去的某个时间。如果该字段是公共可访问和可修改的,则不能强制执行此操作-您需要使用getter和setter。

即使您不需要任何验证,将来也可能需要它。现在,编写getter和setter意味着接口保持一致,因此更改现有代码不会中断。


查看完整回答
反对 回复 2019-11-04
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

其他答案通常可以很好地说明使用getter和setter的一些原因,但是我想给出一个为什么它们有用的完整示例。


让我们以一个文件为例(忽略FileJava中类的存在)。此类File具有用于存储文件类型(.pdf,.exe,.txt等)的字段...我们将忽略其他所有内容。


最初,您决定将其存储为String没有getter和setter的a:


public class File {

   // ...

   public String type;

   // ...

}

这是一些不使用getter和setter的问题。


无法控制字段的设置方式:


您班上的任何客户都可以使用它来做他们想做的事情:


public void doSomething(File file) {

   // ...

   file.type = "this definitely isn't a normal file type";

   // ...

}

稍后您决定不希望他们这样做……但是由于他们可以直接访问您班级中的该字段,因此您无法阻止它。


无法轻松更改内部表示形式:


稍后,您决定将文件类型存储为名为的接口的实例FileType,从而使您可以将某些行为与不同的文件类型相关联。但是,您班上的许多客户端已经在检索文件类型并将其设置为Strings。所以,你有一个问题存在......你会伤了大量的代码,如果你只是改变了字段从(即使在你无法自己解决,如果它是一个库中的其他项目代码)String的FileType。


Getter和Setter如何解决这个问题


现在想象一下,您改为创建了type字段private并创建了


public String getType() {

   return this.type;

}


public void setType(String type) {

   this.type = type;

}

控制设置属性:


现在,当您要实现仅某些字符串是有效文件类型并禁止其他字符串的要求时,您可以编写:


public void setType(String type) {

   if(!isValidType(type)) {

       throw new IllegalArgumentException("Invalid file type: " + type);

   }

   this.type = type;

}


private boolean isValidType(String type) {

   // logic here

}

轻松更改内部表示的能力:


更改String类型的表示形式相对容易。假设您有一个enum ValidFileType实现FileType并包含有效文件类型的。


您可以像这样在类中轻松更改文件类型的内部表示形式:


public class File {

   // ...

   private FileType type;

   // ...

   public String getType() {

      return type.toString();

   }


   public void setType(String type) {

      FileType newType = ValidFileType.valueOf(type);


      if(newType == null) {

         throw new IllegalArgumentException("Invalid file type: " + type);

      }


      this.type = newType;

   }

}

由于班级的客户一直在打电话getType(),setType()无论如何,从他们的角度来看,没有任何变化。仅更改了类的内部,而不更改了其他类正在使用的接口。



查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 322 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信