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

Yat*_*oel 10 java oop setter constructor

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

但是当我在IDE的帮助下生成构造函数时,它直接初始化实例变量,而不是通过setter方法初始化它们.

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

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

============================= EDITED ==================== ===================

  • 我使用Eclipse和Netbeans IDE

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

Jas*_*Day 12

永远不应该从构造函数中调用非final方法.类构造函数用于初始化对象,并且在构造函数返回之前,对象不处于一致状态.如果构造函数调用后来被子类覆盖的非final方法,则可能会得到奇怪的,意外的结果,因为在调用重写方法时对象未完全初始化.

考虑这个人为的例子:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

B.getX() = 0
Run Code Online (Sandbox Code Playgroud)

其原因是Bnumber成员不是在初始化时setX被调用,所以它的默认值0被使用.

本文Effective Java进行了更全面的解释.