2017-05-16 26 views
-3

考慮具有4個領域,一個構造函數和getter基本豆格式類:迫使類實例化規則

public class Foo { 
    private final String id; 
    private final Bar bar; 
    private final boolean invalid; 
    private final String errorMessage; 

    public Foo(String id, Bar bar, boolean invalid, String errorMessage) { 
     this.id = id; 
     this.bar = bar; 
     this.invalid = invalid; 
     this.errorMessage = errorMessage; 
    } 
} 

有一些,我想強加給類的用戶規則。

例如:

  • id參數絕不能爲null或空
  • 當酒吧非空的,無效的肯定是假的和的errorMessage必須爲空
  • 時的errorMessage被非空,酒吧必須爲空
  • 無效時是真實的,必須的errorMessage非空非空,和酒吧必須爲空

ŧ這些規則基本上轉化爲4種有效的Foo對象:

(aString,false,null,null),(aString,false,aBar,null),(aString,true,null,anErrorMessage)和(aString,false ,null,anErrorMessage)。

我該如何強制課程的用戶始終創建其中的4個?

+0

[例外](https://docs.oracle。COM/JavaSE的/教程/本質/例外/)。 – Turing85

+0

你的「*必須是*」是什麼意思:驗證/拒絕或強制分配? –

+0

「必須是」的意思是「對象應該被實例化」。見上面的編輯。 – bez

回答

0

我可以強制課程的用戶在創建Foo 對象時尊重它們嗎?

是的,這是最好的構造函數中執行此。基本上,您可以在構造函數中執行所有的驗證(或者調用其他方法來完成這項工作),並且如果在用戶嘗試實例化對象時滿足而不是,那麼您應該拋出異常指示原因。

我應該使用重載的構造函數?

我會建議在一個構造函數中執行它,並有其他方法在需要時驗證各個細節。

如果您認爲某些內置異常沒有描述引發異常的原因,那麼您可以實現自己的異常,並提供足夠的詳細信息以向類的用戶標識對象不存在的原因實例化。

閱讀:

Builder Pattern

+0

似乎'Builder'模式在這裏很有用。 –

+0

是真的,我應該包含一個鏈接讓OP閱讀。 –

1

聽起來id應該是final,或許等領域也。檢查構造函數參數,如果錯誤則拋出運行時異常。使用assert來記錄不變量。像

public class Foo { 
    private final String id; 
    private final Bar bar; 

    public Foo(String id, Bar bar) { 
    if (id == null || bar == null) { 
     throw new IllegalArgumentException("Constructor argument was null"); 
    } 
    this.id = id; 
    this.bar = bar; 
    assert this.id != null && this.bar != null; 
    } 

    // Getters and overrides 
} 

東西看起來像沒有必要invaliderrorMessage,這絕不應該是擺在首位的實例變量(字段)。

+0

他們都是必要的。最後在這個例子中是無關緊要的。它們只是需要傳遞給構造函數的4個字段,但不是這4個字符的任何組合都是有效的。例如(「someID」,aBar,true,null)無效,我想阻止它。 – bez

+0

那麼,只需展開超出本示例顯示的驗證列表,如果它們被違反,則拋出'IllegalArgumentException'或'IllegalStateException',並對任何設置器執行相同的操作。如果你把所有的領域都定下來,這是個好主意。 'invalid'和'errorMessage'不需要的原因是它們的值是由其他值決定的,因此存儲它們是多餘的,並且是錯誤的入口。 –