2014-02-22 57 views
2

假設我有一個類ClassA,其中的getter和setter方法在我的程序中多次使用。假設在程序結束時,在我一直在使用的ClassA實例中運行public void checkErrors()是非常重要的,如果發生錯誤,它將拋出異常或記錄錯誤。如何擁有一個至少運行一次的公共無效方法

有沒有一種方法可以設置ClassA如果checkErrors()至少被主方法調用一次,會拋出RuntimeException

例如,希望你有一個想象,這將是件好事,就像一個方法:public compulsory void checkErrors()其中compulsory意味着它必須曾經的主要方法運行。

這是一個事件驅動的編程上下文。

在我的問題中,ClassA的實例可能需要進行一些計算,然後不再需要(與類的狀態,由各種內部計算和設置器產生,用於程序的其他部分)。因此,在程序生命結束時,我想在繼續執行程序之前先執行checkErrors()(從而將錯誤傳播停止到程序的後續階段)。

這個compulsory事情只是代表程序員停止錯誤,至少調用一次該方法。

+0

@HovercraftFullOfEels完成。 – user2763361

+0

你可以把你的代碼放在一個try塊中,並在你的代碼末尾使用'finally'子句來保證調用一個方法。 – helderdarocha

+0

初始化類的方法和使用數據的方法之間是否存在明顯區別? – mikea

回答

3

我想硬性規定在ClassA的主要方法checkErrors()ClassB的使用ClassA的的狀態的事件驅動編程案前。

然後你不應該這樣設計程序。相反,您應該引入一個類ValidState並將此類的實例傳遞給ClassB。而ClassA應該有一個方法

ValidState produceValidState() throws IllegalStateException 

這將檢查錯誤,如果沒有,產生有效狀態。

這樣,主方法將無效狀態傳遞給ClassB是完全不可能的。它必須要求ClassA檢查錯誤以獲得ClassB需要的有效狀態。

1

沒有確定的方法來保證對象的方法在構造之後被調用。但是,您可以要求在另一種方法之前調用方法;例如,此模式可用於執行「生命週期」。

boolean errorChecked = false; 

public void checkForErrors() { 
    // do stuff and throw exception if there's a problem 
    errorChecked = true; 
} 

public void doSomething() { 
    if(!errorChecked) 
     throw new IllegalStateException("must call checkForErrors() first"); 

    ... 
} 
3

你所要求違背了面向對象編程的原理,作爲單獨的類應該封裝特定的行爲,而不必與整個節目的流程有關。這個類本身不應該是意識到,它應該發生什麼,它應該被實例化等,這應該在主流程中在類之外進行監視。

因此,如果您需要做得不好,您可以添加一個計數器到ClassA重要,執行了多少次,然後在main中檢查此計數器。

+0

說單元測試應該被用來代替我的建議是否正確? – user2763361

+1

這取決於......如果你只需要驗證代碼的有效性,那麼是的,如果你需要能夠在正常運行時進行檢查,那麼不需要。 – Warlord

2

確實你在說什麼是你班上數據的有效性。在某些時候,數據是有效的。因此,每次更改數據時都需要檢查數據的有效性,並保持這種有效性的狀態。

private boolean isValid; 

public void setSomeData() { 
    // set it 
    checkIfErrors(); 
} 

public Data getSomeData() { 
    if (isValid) { 
    return someData; 
    } else { 
    throw new DataIsInvalidException(); 
    } 
} 

private void checkIfErrors() { 
    if (isOk) { 
    isValid = true; 
    } 
} 
0

雖然這種範例並不適合您正在尋找的目的,但您可以嘗試這樣的事情。 創建班長:

public class Monitor{ 

    private static ArrayList<Object> checkList; 

    public static void addToList(Object a){ // implementation } 
    public static void removeFromList(Object a){ // implementation } 
} 

這個類可以有一個計時器線程,每隔一段時間檢查其內容。然後你就可以建立直接進入你需要檢查得到的類別:

public class ClassA{ 

    public ClassA(){ 

     Monitor.addToList(this); 
     ... 
    } 

    public void checkErrors(){ 

     Monitor.removeFromList(this); 
     ... 
    } 

} 

因此,所有的計時器需要做的是看名單,每隔一段時間,看看有沒有在它的對象爲null。如果其中一個爲空,則不需要致電checkErrors()即可釋放某些內容,並且可以拋出異常。

相關問題