我知道从Java中的对象构造函数调用可覆盖的方法是一种糟糕的(安全性)实践。但是,例如,如果构造函数必须初始化某些数据,则调用相应的setter方法似乎是合理的,这样我就不会复制代码。安装者是公开的,而不是最终的。是否有任何标准的处理方法,如声明私有的setter方法,公共方法调用?为了说明,这里有一些代码:
class A {
private double x,y;
private privateSetX(double x1) { x=x1; }
private privateSetY(double y1) { y=y1; }
public A() { privateSetX(0); privateSetY(0); }
public setX(double x1) { privateSetX(x1); }
public setY(double y1) { privateSetY(y1); }
};
答案 0 :(得分:2)
我认为在构造函数中直接初始化数据成员 是更好的做法。如果你调用一个方法,那么你必须去看看那个方法实现,以验证它是否真的在做它看起来正在做的事情。如果直接分配给数据成员,则知道正在进行初始化。所以在你的代码中:
class A {
private double x, y;
public A() {
x = 0;
y = 0;
}
// ...
}
构造函数通常应该简单,确定,并且显然是正确的。直接分配满足了这些目标。
答案 1 :(得分:2)
如果确实想要这样做,请创建一个由构造函数和公共setter调用的辅助私有setter方法。
答案 2 :(得分:2)
创建在构造期间需要设置许多不同字段的对象的更好方法是使用构建器模式。
我不会重复其他人的努力,而是会针对此主题指出most excellent SO answer。
如果问题是你需要在构造函数中覆盖setter,你可以创建一个Builders层次结构,而不是你正在尝试构建的主类的层次结构,或者除此之外。