3 回答
TA贡献1891条经验 获得超3个赞
无论哪种语言,getter和setter的目的都是隐藏基础变量。这样,您可以在尝试设置值时添加验证逻辑-例如,如果您有一个出生日期字段,则可能只希望将该字段设置为过去的某个时间。如果该字段是公共可访问和可修改的,则不能强制执行此操作-您需要使用getter和setter。
即使您不需要任何验证,将来也可能需要它。现在,编写getter和setter意味着接口保持一致,因此更改现有代码不会中断。
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()无论如何,从他们的角度来看,没有任何变化。仅更改了类的内部,而不更改了其他类正在使用的接口。
添加回答
举报