簡體   English   中英

如何初始化一個類字段?

[英]how to initialize a class field?

我已經看到開發人員以不同的方式初始化其類字段。 其中三個很受歡迎! 有什么區別,它們中的任何一個是否更合適?

class Test {
    ArrayList<String> myArr = new ArrayList<String>(); // First Method 
}


class Test {
    ArrayList<String> myArr;
    public Test() {
        myArr = new ArrayList<String>(); // Second Method
    }
}


class Test {
    ArrayList<String> myArr;
    public Test() {
    }
    public void Init() {
        myArr = new ArrayList<String>(); // Third Method
    }
}

1和2大致等效,還允許您在字段上使用final修飾符。

(不同之處在於,在第一種情況下,該字段在構造函數調用之前被初始化,而在第二種情況下,該字段在構造函數被調用時被初始化。)

圖3是一個懶惰的初始化模式。

第一個和第二個之間沒有太多區別:區別在語法上更強。

在第一種方法中,將聲明和定義放在一起,這樣就不會忘記初始化變量。

如果要根據某些條件進行不同的初始化,則第二種方法和第三種方法可以提供更大的靈活性。

第三個是針對必須具有無參數構造函數的框架的,它們將分別調用“實際”初始化方法(帶有所有必需的參數)。 第三種方法還允許將對象更容易地“重置”為其初始狀態。

注意 :如果您有一個final字段,則只能使用第一種或第二種方法,因為一旦發生初始分配並且該分配必須在構造函數的末尾進行,則無法重新分配它

1和2是等效的,但如果變量是靜態的,則行為會有所不同,例如以下代碼

public class Test {
static String s="2"; // 1

Test()
{
    System.out.println(s);
    s="3"; //2
}

public static void main(String[] args) throws IOException {

    System.out.println("1="+s);
    new Test();
    System.out.println("1="+s); 
 }

在1中,初始化發生在類加載時,但是如果在構造函數(2)中初始化靜態變量,則在構造對象時將分配值。

3)根據需要,您正在初始化變量。

class Test {
ArrayList<String> myArr;
public Test() {
}
public void Init() {
    myArr = new ArrayList<String>(); // Third Method
}
}

關於控制和可讀性:

第一個和第二個是等效的。

第二個幫助您控制初始化的順序。

第三個可以提供延遲(惰性init),例如,如果您測試類並且不想創建所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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