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



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

您可以使用radius,因为它在同一个类中定义。Get和set方法用于从另一个类/对象中获取或设置变量。

您可以,而且确实应该直接使用类字段radius

死记硬背地使用"getter"one_answers"setter"只会导致代码膨胀和封装失败。这也使你的代码不那么线程安全:如果一个线程正在计算面积,而另一个线程通过"setter"改变半径,会发生什么?有时候,甚至是有害的:子类可能会覆盖"getter"或"setter";请记住,所有非static函数在Java中都是"虚拟的"。

最好将所有字段设置在构造函数中,并在必要时提供"getter"。

我们已经不在20世纪70年代了。停止使用float。由于与double之间的内部转换,可能比慢。

这取决于您是否已将radius声明为私有。如果你使用getter和setter来访问它,你应该声明radius是私有的,否则封装就会被破坏。

一个例外可能是当方法"areaccircle()"你提到的是在同一个类,在这种情况下,它将能够直接访问私有半径属性,而不需要使用getter和setter。

供参考:http://www.tutorialspoint.com/java/java_encapsulation.htm

如果你的值可能随时间而变化(例如定时器),那么使用getter

如果存在getter和setter,那么即使在类中也应该始终使用。当然,如果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,则不需要更改代码。

当然,一切都取决于需要和可能的设置,从外部获取属性做一些更多的和不同的,它不满足我们的需要在类。

如果你创建一个私有方法,你可以使用半径而不使用getter或setter,但在公共方法中,最好使用getter和setter。

如果可能的话,我会使用getter和setter。这是更好的,你会得到更少的错误,因为没有他们。

最新更新