是应该直接访问数据成员还是使用getter方法?

时间:2016-09-29 10:17:16

标签: java class oop

假设我有一个包含数据成员Circle的班级float radius。我有一个getter和setter方法getRadius()setRadius(float r)。我用后者来指定半径值。现在,在赋值之后,我应该在计算中使用radius的值(在一个名为areaCircle()的方法中)直接访问它,还是应该调用getter方法?

6 个答案:

答案 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。

因此可以直接使用属性,但我建议使用getset,因为它提供了更多的灵活性,可以做更多的事情而不是典型的分配或获取。

例如,如果在第一位置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。这些更好,你会得到更少的错误,没有它们。