我正在收集個人備忘單的設計模板,並且我發現了一個至少對我而言奇怪的代碼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