我找不到一个带有getter和setter的私有变量的逻辑原因,除了直接处理优于拥有公共变量的值之外什么都不做。
我错过了什么吗?
答案 0 :(得分:5)
由于,
验证是一个原因。将字段名称保留在公共API之外还允许您稍后更改它而不会破坏API。它允许您稍后以其他方式更改课程,例如将字段移动到其他类(以便公共setter将在不同的类中调用setter)。调用setter也允许你做其他事情,例如通知感兴趣的其他组件的价值变化。如果直接访问该字段,这一切都不可能。
答案 1 :(得分:2)
他们更愿意将来证明代码。将来如果要消除变量或使用另一个变量来获取此变量值 - 更改会更简单。您只需更改getter / setter,其余代码不受影响。直接访问变量不是这种情况。
答案 2 :(得分:1)
正如@ user370305已经提到的一个原因是验证。
其他原因是类型转换。 Setter可以接受字符串并将其解析为整数。
另一个原因是数据封装。不一定要将简单的字段存储在同一个类中。类setName(String)
的方法Person
可以将名称存储在更复杂的数据结构中。使用简单字段不允许您更改类Person
的内部实现,而不会影响使用它的代码。
编辑: 还有另一个技术原因。 使用getter和setter更容易发现和调试代码。如果某些字段意外更改,您只需将断点切换到适当的设置器并快速找到问题。如果此字段是公共的,并且您有1000个对此字段的引用,则理论上必须在所有这些位置放置1000个断点。
答案 3 :(得分:1)
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());
答案 4 :(得分:0)
简单..如果你将这些变量设为公开,那么你就可以给予任何值的权利。 但是如果你通过getter或setter这样做...你可以对它进行检查并控制输入或转换而不让最终用户知道
例如:
getName(){
return firstName+lastName;
}
或
getData(){
// code to convert byte to Mb or whatever you like to represent
}
答案 5 :(得分:0)
使用accessors
来限制对字段变量的直接访问比使用public fields
更受欢迎,但是,getters and setter for each and every field is overkill
并认为这不是一个好习惯。它也取决于情况,有时你只想要一个愚蠢的数据对象。应该为真正需要的字段添加Accessors
。请参阅此链接以了解有关它的更多信息Getter Setter: To Use or Not to Use。
答案 6 :(得分:-1)
我找不到一个带有getter和setter的私有变量的逻辑原因,除了直接处理优于拥有公共变量的值之外什么都不做。
考虑到您在getter和setter中添加的任何其他代码都会增加复杂性并且还需要进行测试。对于完全由您控制的小型系统,使用吸气剂和定位器可能没什么好处。用你的专业判断。您可能不需要将来进行校对并增加复杂性。或者,让您获得直接访问的效率和简单性可能更为重要。
就个人而言,我认为吸气剂和制定者过度使用。对于完全由您控制的小型系统,可以直接访问。