Java getter vs this
这是一个非常通用的场景,我使用setter函数设置变量,并且仅在本地使用该变量Java getter vs this,java,Java,这是一个非常通用的场景,我使用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(
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);
}
}
- 伊瓦德
除非您在您希望的<强>公共>强> GETter中有副作用,否则我将考虑始终使用<代码> < < /> >以实现一致性,除非假定继承。p> 雇用私人访问者对我来说毫无意义。常规疗法通常只能做一件事,最好没有副作用。创建私有getter
- 没有副作用只会产生无用的冗余李>
- 有副作用基本上证明该方法做得太多或命名不当
使用
这个
也可能使重构更容易[1]
[1] 重构私有变量的影响小于重构方法。如果您以后决定更改契约,例如,不再提供getter例程,那么重构的机会就会减少。此外,许多编辑器在将光标指向某个变量时会突出显示该变量的所有出现,而在子例程中隐藏该变量的使用时会丢失该变量 不,使用私有getter/setter方法是没有用的。如果它们是公共的或者可以被子类重写,那么情况就不同了。如果子类重写了getter/setter,它可能会改变
display()
方法的工作方式。如果getter是私有的,只返回一个私有变量,那么就不需要它,IMHO(即,我更喜欢第二种访问它的方法)
但是,如果getter是公共的而不是最终的,因此可以由子类重新定义,那么您必须决定是要获取getter返回的潜在重写值,还是要在display方法中获取private字段的值
this.str
。对于更复杂的情况,您可能希望从这样的类继承,并在子类中实现getStr(),也许它会从文件/数据库中惰性地获取字符串。那么这些方法就不是私有的了这里应该至少有一条评论,带有是 通过提供新的抽象屏障,您可以分离数据访问器和数据表示。例如,让我们看看复数类。它可以实现为
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;
}
}
或者以极性表达的形式
假设您应该实现像+-/*这样的基本操作。您应该选择哪种演示模式?对于加法和减法,最好使用标准模型,但对于乘法和除法,最好使用极坐标形式。因此,您可以为这两种形式创建getter。并实现add/_sub_u,就像使用极坐标形式实现标准模型和div/_mult_u一样。此操作不依赖于实际的数据表示。对于更改演示,您应该更改getter。就这些。在Java世界中,它被称为自封装 嗯,你的
sin/cos
表现应该是什么?通常的极坐标表示法是(半径、角度),通过对角度应用正弦和余弦并将结果乘以半径,可以将其转换为笛卡尔形式。通常情况下,int
在这里不是一个好的数据类型,如果您想在表示之间进行转换,更是如此。@Paŭlo Ebermann,int只是一个例子。用极坐标表示——当然半径和角度是我的错。谢谢修正了。现在更好了,但我仍然建议将int改为double,以获得更现实的示例。
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;
}
}