簡體   English   中英

屬性初始化Java

[英]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感到驚訝,我的問題是:

  • 我錯了嗎?
  • Java總是表現得像這樣嗎?
  • 在那種情況下(我個人認為這有點令人困惑):它是否可能在未來的Java版本中刪除?
  • 你會試着避免嗎?

編輯這是書的例子:

在此輸入圖像描述

我擔心的情況是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是向后兼容的語言,這是基本的,不會改變。

你會試着避免嗎?

如果要進行就地初始化,請確保它與其他變量的初始化無關。 否則在構造函數中初始化它。 不要進行復雜的就地初始化。

回答你的問題:

  1. 我相信你錯了,根據Java 8 Specification字段初始化器構造函數體之前執行。
  2. 我相信它有,但不想為每個版本都通過規范。 我不知道有任何變化。
  3. 我懷疑它,看看它是如何成為規范的一部分,如果他們改變了它會破壞兼容性。
  4. 在這種情況下,代碼可以很容易地轉換到由分配給移動明確指出初始化順序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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM