可能的重复:
Getter 和 Setter 是邪恶的吗?
我找不到有一个私有变量背后的逻辑原因,它带有一个 getter 和一个 setter,除了直接处理比拥有公共变量更可取的值之外什么都不做。
我错过了什么吗?
可能的重复:
Getter 和 Setter 是邪恶的吗?
我找不到有一个私有变量背后的逻辑原因,它带有一个 getter 和一个 setter,除了直接处理比拥有公共变量更可取的值之外什么都不做。
我错过了什么吗?
因为,
验证是原因之一。将字段名称保留在公共 API 之外还允许您稍后在不破坏 API 的情况下更改它。它还允许您稍后以其他方式更改类,例如将字段移动到其他类(以便公共设置器将调用不同类中的设置器)。调用 setter 还允许您做其他事情,例如通知感兴趣的其他组件值的变化。如果直接访问该字段,这一切都是不可能的。
他们更喜欢未来证明代码。将来如果您想消除该变量或使用另一个变量来导出此变量值 - 更改会更简单。您只需要更改 getter/setter,其余代码不受影响。这不是直接访问变量的情况。
正如@user370305 已经提到的一个原因是验证。其他原因是类型转换。Setter 可以接受字符串并将其解析为整数。还有一个原因是数据封装。不一定要将简单的文件存储在同一个类中。setName(String)
类的方法Person
可以将名称存储在更复杂的数据结构中。使用简单字段不允许您在Person
不影响使用它的代码的情况下更改类的内部实现。
编辑:还有另一个技术原因。使用 getter 和 setter 发现和调试代码要容易得多。如果某些字段意外更改,您可以将断点切换到适当的设置器并很快找到问题。如果这个字段是公开的,并且你有 1000 个对该字段的引用,那么理论上你必须在所有这些地方放置 1000 个断点。
1. 在不同的上下文中Encapsulation
有不同的用途,类似的不断变化的行为需要封装在抽象类或接口中。design patterns
2.拥有private instance variable
和public getter setter
是 b
3.主要是验证用户的输入... 直接将值设置为实例变量是危险的。
例如:
int dogAge;
System.out.println("My dogs age is :"+dogAge);
现在,如果有人给出负年龄怎么办......那么......???
所以我们必须这样做……
int dogAge;
public void setAge(int age){
if (age>0){
dogAge = age;
}
else{
System.out.println("Not a valid age");
}
}
public int getAge(){
return dogAge;
}
System.out.println("My dog age is :"+ getAge());
它很简单.. 如果您将这些变量公开,那么您就授予了向它们添加任何值的权利。但是,如果您通过 getter 或 setter 执行此操作……您可以对其进行检查并控制输入或转换,而无需让最终用户知道
例如:
getName(){
return firstName+lastName;
}
或者
getData(){
// code to convert byte to Mb or whatever you like to represent
}
使用accessors
来限制对字段变量的直接访问优于使用public fields
,但是,这样做getters and setter for each and every field is overkill
并被认为不是一个好习惯。不过,这也取决于具体情况,有时您只需要一个哑数据对象。Accessors
应该为真正需要它们的字段添加。请参阅此链接以了解有关它的更多信息Getter Setter: To Use or Not to Use。
我找不到有一个私有变量背后的逻辑原因,它带有一个 getter 和一个 setter,除了直接处理比拥有公共变量更可取的值之外什么都不做。
考虑到您在 getter 和 setter 中添加的任何其他代码都会增加复杂性并且还需要进行测试。对于完全由您控制的小型系统,使用 getter 和 setter 可能没有什么好处。运用你的专业判断。您可能不需要未来的校对和增加的复杂性。或者,拥有直接访问的效率和简单性对您来说可能更重要。
就个人而言,我认为 getter 和 setter 被过度使用了。对于完全由您控制的小型系统,直接访问可能是可行的方法。