2013-08-22 68 views
3

以下類型的實例有什麼區別嗎? 是否直接在定義變量的位置或類構造函數中設置值。在構造函數或類中分配屬性值,哪個更好?

如果不是,最佳做法是什麼?

「以類」:

class A { 
    boolean b = true; 

    public A(){ 
    } 
} 

「以構造」:

class B { 
    boolean b; 

    public B(){ 
     b = true; 
    } 
} 

變量類型是隻爲示例。 我看到的唯一區別是,在屬性是一個複雜的類型(類),其構造取決於被給予含有類的構造函數值:

class A { 
    B b; 
    public A(String s){ 
     b = new B(s); 
    } 
} 
+1

所有三種情況都取決於具體的要求,你不能使用情況1,當你有案例2或情況3的要求。多練習,然後你會自己得到答案,並相信我會很棒。 :) –

+0

絕對正確的聲明@ user2320537。 –

回答

4

其實他們兩個是等價的。然而,從可讀性的角度來看,第一個更具可讀性。此外,當有人導航到IDE的變量聲明時(例如ctrl +在Eclipse中單擊鼠標),很容易看到默認值。

檢查什麼the official tutorial不得不說 -

這種運作良好,當初始化值可用並且 初始化一行可以放。但是,這種初始化形式由於其簡單性而具有侷限性。如果 初始化需要某些邏輯(例如,錯誤處理或用於填充複雜數組的循環),則簡單分配是不充分的。 實例變量可以在構造函數中初始化,其中可以使用錯誤 處理或其他邏輯。爲了爲類變量提供相同的功能 ,Java編程語言包括靜態的 初始化塊。

因此,當過程很簡單時,您可以輕鬆使用簡單的單線初始化技術。對於複雜的初始化選擇,構造函數是要走的路。

0

實例變量的情況下,分配缺省值你不分配一個! Bu默認的布爾實例變量賦值爲false。

public class HelloWorld { 

    boolean b; 

    public void printData() { 
     System.out.println("Defualt boolean value is " + b); 
    } 


    public static void main(String args[]) { 
    HelloWorld hw = new HelloWorld(); 
    hw.printData(); 
    } 
} 

並且輸出是Defualt boolean value is false

你在哪裏分配你的變量純粹是一個設計選擇。

2

如果您將值賦予類中的變量,那麼在創建類的實例時,直接將您希望的值分配給變量。

如果您在構造函數中賦值,那麼您的變量將首先被分配一個默認值,然後來自構造函數的值將被賦值。

閱讀來自initialization blocks, constructors and their order of execution

在最佳實踐的情況下,

  • 如果通過了所有的值到costructor是必須在創建對象,則必須使用建築初始化。
  • 如果每個對象都有一些需要默認的值,那麼可以分配外部構造函數。
0

我建議C:

class C { 
    private boolean b = true; 

} 

- >沒有(明確)構造 - >更少的代碼 - >更容易閱讀

1

使用初始化塊。 Initializing Fields

public class X { 

    // The following is the initializer block 
    { 
    } 

    public X() { 
    } 
} 
0

兩者幾乎相同。

但是從docs

有效線。實例變量可以在構造函數中初始化,其中可以使用錯誤處理或其他邏輯。

0

實例字段初始化由編譯器複製到構造函數的開頭,所以前兩種方法生成完全相同的代碼(或相當麻煩)。

(但是請注意,上面是不是靜態字段初始化VS的static初始化方法完全正確。)

這是主要問題,其似乎更清晰,不太可能導致在道路上的混亂/錯誤。這取決於衆多因素,包括個人風格。

相關問題