假设我有一个包含数据成员Circle
的班级float radius
。我有一个getter和setter方法getRadius()
和setRadius(float r)
。我用后者来指定半径值。现在,在赋值之后,我应该在计算中使用radius
的值(在一个名为areaCircle()
的方法中)直接访问它,还是应该调用getter方法?
答案 0 :(得分:7)
您可以在同一个班级中定义使用半径。获取和设置方法用于从另一个类/对象获取或设置变量。
答案 1 :(得分:2)
您可以,而且实际上,您应该直接使用类字段radius
。
通过死记硬背获得“getters”和“setter”只能实现代码膨胀和封装失败。它还使您的代码更少线程安全:如果一个线程计算区域而另一个线程通过“setter”改变半径会发生什么?它有时甚至可能有害:子类可能会覆盖“getter”或“setter”;请记住,所有非static
函数都是Java中的“虚拟”。
最好将所有字段设置在构造函数中,如果真的必须提供“getter”。
我们不再是20世纪70年代了。停止使用float
。由于与后者之间的内部转换,它可能慢而不是double
。
答案 2 :(得分:0)
如果存在getter和setter,那么应该总是在class中使用。当然,如果getter和setter在方法上做了更多的事情,那么必须考虑它是否满足了你的需求。
应该使用不是必须使用的手段。您可以直接使用属性radius
(如果属性是私有的,则只在内部类中 - 应该是)但实际上是使用getter和setter。
因此可以直接使用属性,但我建议使用get
和set
,因为它提供了更多的灵活性,可以做更多的事情而不是典型的分配或获取。
例如,如果在第一位置setter只设置一些东西,但在一段时间之后setter被更改为做更多的事情。
setName(name){
this.name="name";
}
因此,代码setName("John");
中的name="John"
相等。但想象一下,我们想在设置name
时设置另一个属性:
setName(name){
this.name="name";
this.nameIsSet=true;
}
另一个例子(听众模式):
setName(name){
this.name="name";
this.listener.nameChanged(this.name); //we call listener that variable changed
}
然后程序员需要在课堂上找到像name="John"
这样的每个分配,并将其重构为新的行为。如果仅使用setName
,则不必更改代码。
当然,一切都取决于需要,并且设置,从外部获取财产可以做更多和更多的事情,而不是满足我们在课堂上的需要。
答案 3 :(得分:0)
这取决于你是否声明了半径私有。如果使用getter和setter来访问它,则应该声明radius为private,否则封装会被破坏。
例外情况可能是当你提到的方法“areaCircle()”在同一个类中时,在这种情况下它将能够直接访问私有radius属性而无需使用getter和setter。
供参考: http://www.tutorialspoint.com/java/java_encapsulation.htm
答案 4 :(得分:0)
如果您的值可能会超时(例如计时器),请使用getter。
答案 5 :(得分:-1)
如果你创建一个私有方法,你可以使用没有getter或setter的半径,但在公共mehtodes中最好使用getter和setter。
如果有可能我会使用getter和setter。这些更好,你会得到更少的错误,没有它们。