[英]Attributes initialization Java
我正在為個人備忘單收集設計圖案,我在Head First Design Patterns(Eric Freeman,Elisabeth Robson,Bert Bates,Kathy Sierra)中找到了一個至少對我來說奇怪的代碼。
我不認為我可以在這里發布完整的代碼片段寫在書中,但我會重現讓我感到震驚的代碼:
假設我們之前使用公共方法runSomeCode()對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構造函數執行結束時完成,但我仍然對這個sintaxis感到驚訝,我的問題是:
編輯這是書的例子:
我擔心的情況是numberGumballs = 0;
編輯二
我想我知道這個例子發生了什么。
在這本書中,所引用的類不聲明為static,但幾分鍾前,我認為它可以編譯如果A是靜態的。 所以,也許,這本書的作者從一個更大的項目中獲得了代碼,其中使用了靜態類。 所以我嘗試了這一點,這次它確實有效,但是這個例子似乎仍然是錯誤的,下面的代碼對State模式沒有任何意義。
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網站勘誤表部分,在未經證實的erratas子部分你可以找到:
我錯了嗎?
就地變量初始化在構造函數初始化之前工作,其順序與代碼中定義的變量相同。
Java總是表現得像這樣嗎?
是。
在那種情況下(我個人認為這有點令人困惑):它是否可能在未來的Java版本中刪除?
不,Java是向后兼容的語言,這是基本的,不會改變。
你會試着避免嗎?
如果要進行就地初始化,請確保它與其他變量的初始化無關。 否則在構造函數中初始化它。 不要進行復雜的就地初始化。
回答你的問題:
x
到構造。 將它作為字段初始化程序沒有任何好處,這對我來說是顯而易見的。 應該是這個“模式”的重點是什么? 你最終得到了兩個參考文獻,其中一個人會做...為什么不只是使用a
?
首次創建B類型的對象時,首先初始化具有任何初始化的字段。 所以, A x = a;
首先執行,甚至在執行構造函數中的代碼之前執行,該代碼將x的值設置為null,因為尚未實例化並且只是類型A的空引用。之后,執行以下代碼創建兩個對象。
public B() {
a = new A();
b = new A();
}
此時x仍為null。 因此,當您嘗試使用x在A類中執行方法時,它將拋出空指針異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.