我正在收集个人备忘单的设计模板,并且我发现了一个至少对我而言奇怪的代码Head First Design Patterns(Eric Freeman,Elisabeth Robson,Bert Bates,Kathy Sierra)。属性初始化Java
我不认为我确切地允许在这里发表的一段代码在写这本书,但我将重现让我震惊的代码:
假设我们先前deffined类A
用公共方法runSomeCode(),然后我们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处的构造函数执行结束时进行,但我仍然这样sintaxis感到惊讶,我的问题是:
- 上午我错了?
- Java总是表现得像这样吗?
- 在这种情况下(我个人认为这有点令人困惑):它可能会在未来的Java版本中被删除吗?
- 你会尽量避免它吗?
编辑这是本书例如:
我关心的是这样,当numberGumballs = 0;
编辑II
我想我知道用的例子发生了什么事。
在书中,被引用的类是不是声明为静态,但几分钟前,我认为它可以编译,如果A是静态的。所以,也许,这本书的作者从一个更大的项目中得到了使用静态类的代码。所以我尝试了这一点,这一次,它确实有效,但是这个例子似乎仍然是错误的,下面的代码对State pattern没有任何意义。
public class B {
public static class Base {
public static void runSomeCode() { System.out.println("Base!"); }
}
public static class A extends Base {
public static void runSomeCode() { System.out.println("A!"); }
};
A a;
A b;
A x = a;
public B() {
a = new A();
b = new A();
}
public void testB()
{
x.runSomeCode();
}
}
然而,另一个编辑
看来我还没有注意到书中例如这个问题的第一个, 在O'Reilly site errata section, under unconfirmed erratas sub-section你可以找到:
它确实会抛出一个NPE,你可以(实际上)尝试它。 – m0skit0
@ m0skit0你是对的我在深夜测试了这个案例,我可能做了一些不同的事情。然而,这本书的例子就是这样,所以书本错了,或者我是盲人/白痴 –
书中的例子是错误的,有时会发生;) – m0skit0