Java getter vs this

这是一个非常通用的场景,我使用setter函数设置变量并仅在本地使用变量。

class Main { private String str; public Main(String value) setStr(value); } private String getStr() { return str; } private void setStr(String str) { this.str = str; } public void display() { //METHOD1 System.out.println(getStr()); //METHOD2 System.out.println(this.str); } } 
  1. 在显示函数中两个METHOD1 / 2之间遵循什么是更好的做法,基本上是使用“str”变量的更好方法。

  2. 拥有私有的getter / setter函数是否有意义?

    • Ivard

如果getter是私有的,并且只是返回一个私有变量,则不需要它,恕我直言(即我更喜欢第二种访问它的方法)。

但是如果getter是公共的而不是final的,因此可以由子类重新定义,那么你必须决定是否要获取getter返回的可能被覆盖的值,或者你是否想要私有字段的值在显示方法中。

这里应该至少有一条带有是的评论。

通过提供新的抽象障碍,您可以分离数据访问器和数据表示 。 例如,让我们看一下复数类。 哪个可以实现为

 class ComplexNumber { private final double realPart; private final double imaginaryPart; ComplexNumber(double realPart, double imaginaryPart) { this.realPart = realPart; this.imaginaryPart = imaginaryPart; } public double getRealPart() { return realPart; } public double getImaginaryPart() { return imaginaryPart; } } 

或以极地表达forms

 class ComplexNumber { private final double r; private final double angle; ComplexNumber(double r, double angle) { this.r = r; this.angle = angle; } public double getR() { return r; } public double getAngle() { return angle; } } 

假定你应该实现像+ – / *这样的基本操作。 你应该选择什么样的演示模型? 对于加法和减法标准模型是优选的,但对于乘法和除法极性forms是优选的。 因此,您可以为两种forms创建getter。 并实现add / _sub_就像你有标准模型和div / _mult_喜欢极性forms。 此操作不依赖于您的实际数据显示。 对于更改演示文稿,您应该更改getter。 就这样。 在Java世界中,它被称为自封装

  1. 对于简单的情况,你只需使用this.str 。 对于更复杂的情况,您可能希望从这样的类inheritance,并且在子类中实现getStr(),也许它会懒惰地从文件/数据库中获取字符串。 然后这些方法不会是私密的。

  2. 对于你只是分配和获取私人成员的琐碎案例,不是真的。 对于可能需要执行其他逻辑的更复杂的情况,将该逻辑限制在一个地方是有意义的。 与1.一样,如果您希望子类重写方法,那将是有意义的。

除非你在公共吸气器中有副作用,否则我会考虑始终使用this来保持一致,除非假定inheritance。

雇用私人访问者对我来说根本没有任何意义。 例程通常应该只做件事,最好没有副作用。 创建一个私有的getter

  • 没有副作用只会产生无用的冗余。
  • 副作用基本上certificate该方法做得太多或命名不佳

使用this也可以使重构更容易[1]。

[1]重构私有变量比重构方法的影响小。 如果您以后决定更改合同,例如,通过不再提供getter例程,您将获得更少的重构。 此外,许多编辑器在将光标指向它时突出显示变量的所有出现,当将其用于子例程时,该变量会丢失。

不,拥有私有的getter / setter方法没用。 如果它们是公共的或者是子类可以覆盖的,尽管这是一个不同的故事。 如果子类覆盖了getter / setter,它可能会改变display()方法的运行方式。