这是一个非常通用的场景,我使用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);
}
}
在显示功能中,两个METHOD1 / 2之间遵循什么是更好的做法,基本上是使用“str”变量的更好方法。
拥有私有的getter / setter函数是否有意义?
答案 0 :(得分:3)
如果getter是私有的,并且只是返回一个私有变量,则不需要它,恕我直言(即我更喜欢第二种访问它的方法)。
但是如果getter是公共的而不是final,并且因此可以由子类重新定义,那么你必须决定是否要获取getter返回的可能被覆盖的值,或者如果你想要的值显示方法中的私有字段。
答案 1 :(得分:2)
此处应至少有一条评论是。
通过提供新的抽象障碍,您可以分离数据访问者和数据表示。例如,让我们看一下复数类。哪个可以实现为
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;
}
}
或极坐标表达式形式
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;
}
}
假设你应该实现像+ - / *这样的基本操作。你应该选择什么样的演示模型?对于加法和减法标准模型是优选的,但对于乘法和除法极性形式是优选的。因此,您可以为两种形式创建getter。并实现添加 / _ sub_,就像你有标准模型一样, div / _ mult_就像极性形式一样。此操作不依赖于您的实际数据显示。对于更改演示文稿,您应该更改getter。就这样。在Java世界中,它被称为自封装。
答案 2 :(得分:1)
除非您在 public getter中有副作用,否则我会考虑始终使用this
来保持一致性,除非假设继承。
使用 私有 访问器对我来说根本没有任何意义。例程通常应该只做一个事物,最好没有副作用。创建一个私人的getter
使用this
也可能使重构更容易[1]。
[1]重构私有变量比重构方法的影响小。如果您以后决定更改合同,例如,不再提供 getter 例程,您将获得更少的重构。此外,许多编辑器在将光标指向变量时突出显示变量的所有出现,当将其用于子例程时,该变量会丢失。
答案 3 :(得分:1)
对于简单的情况,您只需使用this.str
。对于更复杂的情况,您可能希望从这样的类继承,并且在子类中实现getStr(),也许它会懒惰地从文件/数据库中获取字符串。然后这些方法不会是私密的。
对于您只是分配和获取私有成员的琐碎案例,不是真的。对于可能需要执行其他逻辑的更复杂情况,将该逻辑限制在一个地方是有意义的。与1.一样,如果您希望子类重写方法,那将是有意义的。
答案 4 :(得分:0)
不,拥有私有的getter / setter方法没用。如果它们是公共的或者是子类可以覆盖的,尽管这是一个不同的故事。如果子类覆盖了getter / setter,它可能会改变display()
方法的运行方式。