2017-05-03 96 views
1

編輯:對於我以前的問題,最後的關鍵字會讓您困惑,這是不合適的。對於我可憐的英語也很抱歉。確保字段初始化爲構造函數

----- ------題

假設我有一個模型類沒有任何的構造函數,因爲我需要很多不同的邏輯中初始化。 我有一個notnull關鍵字。

public class Model { 
    public notnull String name; 
    public notnull String address; 
    public notnull int age; 
} 

,我需要用它在不同的地方,但繼續檢查,如果所有NOTNULL場進行初始化,在編譯時

Model m = new Model(); 
m.name = "Hello"; 
m.age = 15; 
// syntax error, you should set Model.address 

或者

Model m1 = new Model(); 
m1.address = "World"; 
m1.age = 20; 
// syntax error, you should set Model.name 

哪有我在java中實現? Thx。

+2

我很困惑。如果它們是最終的,你*必須*在構造函數中初始化它們。 –

+1

當你將它們聲明爲'final String a =「A」',在每個構造函數中聲明爲'a =「A」'或者在實例初始化塊中聲明爲'{a =「A」}'時,否則會出現編譯時錯誤。你現在做的方式是設置'final',這是沒有意義的,因爲你不需要初始化它們,這會與'final'的結果相矛盾。 – SomeJavaGuy

+1

和「但我有一個新的關鍵字說notnull」大聲笑.. –

回答

0

你應該看看Builder模式。網上有很多關於如何使用它的文章。這是一個例子https://jlordiales.me/2012/12/13/the-builder-pattern-in-practice/。使用Builder模式,您可以驗證是否設置了某些字段,如果沒有,則拋出異常。

+0

對於仍在學習Java基礎的人來說,這可能不是一個合適的答案。 – ajb

+0

@ajb其實我有像JSON解析器,HTTP服務器,以及我自己用純Java構建的許多其他工具。我的意思是這不是一個基本的問題,我認爲; -P –

+0

@tabiul感謝您的回答,我期待更多的語法級解決方案(檢查編譯時間)。你的答案實際上是一個工廠設計模式,意思是我應該寫另一個類,它不會在編譯時檢查。 –

2

假設我有一個模型類沒有任何constractor

這是不可能的。每個類都有一個構造函數。如果你沒有定義一個你最終的默認構造函數。你的情況:

public Model() { 
    super(); 
} 

檢查是否所有的最終場均初始化

首先,最終的領域必須進行初始化,否則編譯器不會編譯。因此,你必須有初始化final字段之一:

在構造
  • 聲明最後一個字段時

構造函數初始化

public final String name; 
public final int age; 

public Model() { 
    this.name = "Hello"; 
    this.age = 13; 
} 

宣言初始化

public final String name = "Hello"; 
public final int age = 13; 

public Model() { 
    super(); 
} 
0

如果只有最後一個: 您可以將它們實例化爲您在構造函數中聲明或實例化的位置。

如果final + static: 您必須在聲明的地方實例化它們。

因此,因爲它們不是靜態的,所以你需要實例化你指定它們的地方或者構造函數。

1

你可以實現你似乎希望像這樣的東西:

public class Model { 
    private final String name; 
    private final String address; 
    private final int age; 

    public Model(final String name, final String address, final int age) { 
     if (name == null) { 
      throw new IllegalArgumentException("please provide a name"); 
     } 
     if (address == null) { 
      throw new IllegalArgumentException("please provide an address"); 
     } 
     this.name = name; 
     this.address = address; 
     this.age = age; 
    } 

    // getters 
} 

用法:

new Model("World", "Some address", 20) // OK 
new Model("World", null, 20) // Exception because null address. 
0

假設我有一個模型類沒有任何的構造函數,因爲我需要 在許多不同的邏輯中初始化它。但我有一個沒關係的 關鍵字。

你需要注意的是即使你不寫任何構造函數,編譯器會提供一個默認的無參數的構造將自動初始化對象爲默認值的所有字段(即String類型nullint類型的零值,等等。)


類的構造是,以驗證所有強制字段提供一個合適的位置或不,所以穿心蓮Ë自己的構造函數來檢查所有必填字段的對象創建過程中傳遞:

public class Model { 
    private String name; 
    private String address; 
    private int age; 

    public Model(String name, String address, int age) { 
     if(name == null) { 
       throw new IllegalArgumentException(" Name is mandatory "); 
     } 
     if(address == null) { 
       throw new IllegalArgumentException(" Address is mandatory "); 
     } 
     if(age < 0) { 
       throw new IllegalArgumentException(" Age is Invalid "); 
     } 
     this.name = name; 
     this.address = address; 
     this.age = age; 
    } 
    //Add getters and setters 
} 

此外,封裝你Model類的數據通過標記你的領域private(如上圖所示)。