繁体   English   中英

Java 构造函数中的可覆盖调用

[英]Java overridable call in constructor

我知道从 Java 中的 object 构造函数调用可覆盖方法是一种不好的(安全)做法。 但是,例如,如果构造函数必须初始化一些数据,调用相应的 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); }
};

创建需要在构造期间设置许多不同字段的 object 的更好方法是使用Builder Pattern

与其重复其他人的努力,我只会为您指出关于该主题的最出色的 SO 答案

如果问题是您需要在构造函数期间覆盖设置器,您可以创建一个 Builders 层次结构,而不是创建您尝试构建的主要 class 的层次结构,或者除此之外。

我认为直接在构造函数中初始化数据成员是更好的做法。 如果您调用一个方法,那么您必须 go 查看该方法的实现,以验证它确实在做它看起来正在做的事情。 如果您直接分配给数据成员,您就知道正在初始化。 所以在你的代码中:

class A {
    private double x, y;
    public A() {
        x = 0;
        y = 0;
    }
    // ...
}

构造函数通常应该简单、确定且明显正确。 直接分配可以满足这些目标。

如果您真的想这样做,请创建一个由构造函数和公共 setter 调用的辅助私有 setter 方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM