java - 为什么从构造函数调用 Set 方法不是一个好主意?

标签 java inheritance

是仅在继承中还是在大多数情况下都是如此?

public class MyClass {
   public int id;

     public MyClass() {
         // Some stuff 
         setId(5);
     }

     public setId(int id) {
         this.id = id;
     }
}

最佳答案

这是非常真实的。

因为 setter 始终是 public 方法。如果你的类不是 final 那么就会有外来方法调用的问题。这不是线程安全的,即它被称为转义 this 引用。因此,从构造函数调用方法时,它应该是 finalprivate。否则对象的安全初始化将不会发生,这会导致实际系统中的许多错误。

除上述之外,我们永远不应该从构造函数调用public方法,因为如果该类用于继承,则构造函数不得直接调用可重写的方法或间接

如果违反了这条规则,就会导致程序失败。父类(super class)构造函数在子类构造函数之前运行,因此子类中的覆盖方法将在子类构造函数运行之前被调用。如果覆盖方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。

source .

关于java - 为什么从构造函数调用 Set 方法不是一个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116597/

相关文章:

java - 向 CometD 订阅消息添加自定义字段

java - 无法使用 neo4j spring 数据向一个节点添加更多关系

c# - 在 C# 中验证属性

c++ - 从子类c++调用基类方法

c++ - 访问虚拟派生类的成员/方法

python - 具有不同参数的 Python 中的继承

java - 按特定字符序列将文本文件拆分为多个文件

java - Jinterop 冒充

java - 如何在 JNI 中处理类结构体 jobject

c++ - 赋值运算符继承