2016-11-06 15 views
1

有一個類:如何強制java對象以特定的順序實例化它的實例變量?

class Test { 

    Object1 object1; 
    Object2 object2; 

    void setObject2 (Object2 newObject) { 
    if (object1.someMethod()) { 
     this.object2 = newObject; 
    } else { 
     someOtherMethod(); 
    } 
    } 
} 

如何強制對象實例化是object1必須object2之前實例?

現在我能想到的與Object2作爲參數來解決它

1.by使得構造和初始化它有

Test(Object1 object1) { 
    this.object1 = object1; 
} 

2.by從中嘗試設置object2

方法引發異常
void setObject2 (Object newObject) { 
    if (object1 == null) { 
    throw new Exception(); 
    } 
    ... 

是否有其他更適當的方法來實現它?

的原因,我需要的是,我要創建新的廣告活動Test一個區域object1做廣告該地區一些網站object2的。在我可以將網站添加到廣告系列之前,我想檢查該網站是否屬於該地區。

+0

我可以問你你的目的是什麼? – acornagl

+0

@acornagl你問我嗎? – ItamarG3

+0

@ItamarGreen不,我很抱歉我要求Marcin,但是'@' – acornagl

回答

3

更清晰的設計方式可以使用Builder模式。通過這種方式,您只能以正確的方式設置和創建對象,而不是在運行時獲取異常。

程序員不需要閱讀文檔或錯誤消息來找出他需要做什麼,因爲API會自我引導。

+0

其實,我在我的真實代碼中使用Builder-pattern。我試圖讓我的問題一般,而不是綁定到具體的情況。即使我使用builder,我需要使用一些算法來檢查實例變量是否以正確的順序實例化。 –

3

您可以限制object2的初始化,以便只能在object的情況下立即執行。

public void setObject2 (Object2 newObject) { 
    if(object1 == null){ 
     throw new IllegalStateException(); 
    }else{ 
     this.object2 = newObject; 
    } 
} 
+1

上面是正確的,此外,該方法可以拋出java.lang.IllegalStateException,所以在類上工作的人知道某些東西已被搞亂。 * IllegalStateException:表示某個方法在非法或不適當的時間被調用。換句話說,對於請求的操作,Java環境或Java應用程序沒有處於適當的狀態。* –

+0

這是一個壞主意,因爲調用者無法知道調用者的調用沒有效果。 – Bohemian

+0

@波希米亞修復它。實現srinath的想法 – ItamarG3

0

是,初始化變量,以適當的狀態應該使用構造函數來完成,實際上就可以創建一個Test class constructor來達到同樣的,如下圖所示:

public Test(Object1 obj1, Object2 obj2) { 
    //if objects are null throw an error 
    if(obj1 == null) { 
     throw IllegalStateException("Invalid Object1 passed"); 
    } else { 
     this.obj1 = obj1; 
    //check someMethod() returns true and then set object2 
    if (obj1.someMethod()) { 
     this.obj2 = obj2; 
    } else { 
     //obj1.someMethod() is false, call someOtherMethod() 
     someOtherMethod(); 
    } 
    } 

它是拋出Exception(最佳實踐如上所述),如果它是強制變量狀態未正確初始化,以便該對象創建後不會處於不一致的狀態。

+0

如果使用你的構造函數,那麼異常將被拋出所有的時間(obj1始終爲空) –

+0

爲什麼obj1總是空? – developer

+0

對不起,我以爲你指的是'this.obj1'。 –