属性初始化Java
我正在收集一份个人备忘单的设计模式,我发现了一段奇怪的代码,至少对我来说是这样,它是头先设计模式(由Eric Freeman、Elisabeth Robson、Bert Bates、Kathy Sierra编写) 我不认为我被允许在这里发布这本书中所写的代码,但我将重现让我震惊的代码: 假设我们以前使用一个公共方法runSomeCode()定义了类属性初始化Java,java,constructor,Java,Constructor,我正在收集一份个人备忘单的设计模式,我发现了一段奇怪的代码,至少对我来说是这样,它是头先设计模式(由Eric Freeman、Elisabeth Robson、Bert Bates、Kathy Sierra编写) 我不认为我被允许在这里发布这本书中所写的代码,但我将重现让我震惊的代码: 假设我们以前使用一个公共方法runSomeCode()定义了类A,那么类B如下所示: public class B { A a; A b; A x = a; public B(
A
,那么类B如下所示:
public class B {
A a;
A b;
A x = a;
public B() {
a = new A();
b = new A();
}
public void testB()
{
x.runSomeCode();
}
}
我看这段代码的第一印象是,任何对B实例testB方法的调用都应该抛出一个NullPointerException
,但我无法想象他们会发布这样一个错误
如果这本书是对的,那么我理解这一点
x = a;
必须在B构造函数执行结束时完成,但我仍然对此感到惊讶,我的问题是:
- 我错了吗
- Java总是这样吗
- 在这种情况下(我个人认为这有点混乱):它是否可能在未来的java版本中被删除?
- 你会尽量避免吗
如果需要就地初始化,请确保它独立于其他变量的初始化。否则在构造函数中初始化它。不要进行复杂的就地初始化。要回答您的问题:
x
到构造函数中,可以很容易地将代码更改为显式说明初始化顺序。将其作为字段初始值设定项并没有明显的好处这种“模式”的意义何在?您只需使用两个引用就可以了……为什么不直接使用
a
呢?当您第一次创建类型为B的对象时,具有任何初始化的字段都会首先初始化。所以,ax=A代码>首先执行,甚至在构造函数中的代码执行之前执行,该代码将x的值设置为null,因为a尚未实例化,只是类型a的null引用。在此之后,执行以下代码,创建两个对象
public B() {
a = new A();
b = new A();
}
此时x仍然为空。因此,当您尝试使用x在类中执行方法时,它将抛出空指针异常。它肯定会抛出NPE,您可以(实际上)尝试它。@m0skit0您是对的,我在深夜测试了该案例,可能做了一些不同的事情。然而,书中的例子是这样的,所以书是错的,或者我是瞎子/白痴书中的例子是错的,有时会发生;)我同意。看来你在书的代码中发现了一个错误。这是一个笑话,这本书太棒了。我在问题中已经说过,就我所知,它毫无意义。另一方面,我在深夜测试了它,我想我可能做了一些不同的事情,但我会尝试复制它。我在问题中已经说过,就我所知,它毫无意义。另一方面,我在深夜测试了它,我想我可能做了一些不同的事情,但我会尝试复制它。
public B() {
a = new A();
b = new A();
}