Java - 是否应该通过 getter 和 setter 方法在构造函数中访问私有实例变量?

2024-01-24

我知道私有实例变量是通过其公共 getter 和 setter 方法访问的。

但是,当我借助 IDE 生成构造函数时,它会直接初始化实例变量,而不是通过其 setter 方法来初始化它们。

Q1.因此,我是否应该更改 IDE 为构造函数生成的代码,以通过它们的 setter 方法初始化这些实例变量。

Q2。如果是,那么为什么 IDE 不以这种方式生成构造函数代码?

=============================已编辑==================== ===================

  • 我使用 Eclipse 和 Netbeans IDE

  • 这是一个普遍问题。但正如 @Lords 所问,答案取决于我们的构造函数是公共的还是受保护的,还是包私有的还是私有的?


你应该never从构造函数调用非最终方法。类构造函数用于初始化对象,并且在构造函数返回之前,对象不会处于一致状态。如果您的构造函数调用一个非最终方法,该方法后来被子类重写,您可能会得到奇怪的、意外的结果,因为在调用重写的方法时该对象尚未完全初始化。

考虑这个人为的例子:

class A {
    private int x;

    public A() {
        setX(2);
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getX() {
        return x;
    }
}

class B extends A {
    private int number = 10;

    @Override        
    public void setX(int x) {
        // set x to the value of number: 10
        super.setX(number);
    }
}

public class Test {
    public static void main(String[] args) {
        B b = new B();
        // b.getX() should be 10, right?
        System.out.println("B.getX() = " + b.getX());
    }
}

该程序的输出是:

B.getX() = 0

原因是B's number当时成员尚未初始化setX被调用,所以它的默认值为0用来。

本文 http://www.informit.com/articles/article.aspx?p=20521有更彻底的解释,就像有效的Java.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 是否应该通过 getter 和 setter 方法在构造函数中访问私有实例变量? 的相关文章

随机推荐