2012-10-26 61 views
0

這裏是我的代碼:如何影響一個返回值從void方法

deleteStuffFromDb(); // void method 
deleteStuffFromCache(); 

deleteStuffFromDb()的接口方法與返回類型,void

理想情況下,第一種方法會返回一個值(成功/失敗)。這個返回值將決定第二個方法是否執行。

我可以修改接口,因爲它被2個類調用。但是,仍然存在這樣的風險:作爲沒有系統全貌的開發人員,我可能會破壞某些東西。

你如何建議我確定這個void deleteStuffFromDb()的執行是否決定了deleteStuffFromCache()的執行。

這裏有一些方法,我想:

  1. 把一個try/catch周圍deleteStuffFromDb(),拋出一個異常的錯誤情況。如果遇到catch(),則不要執行deleteStuffFromCache()。
  2. 將deleteStuffFromCache()的邏輯放入方法deleteStuffFromDb()中,並允許/不允許其在此方法內執行
  3. ...?

請給我你的想法和你選擇的理由。

謝謝。

+0

接口是公共的,受保護的,包裝私人的還是私人的?越私密,你就有更多的自由來改變它。 – emory

+0

它是公開的。但爲什麼私人關鍵字給了我更多的自由來改變它呢? –

+1

@Kevin因爲更多的protected-> package private-> private,其他類甚至可以看到它。 – EJP

回答

2

我可以修改接口,因爲它被2個類調用。 然而,還是有,作爲一個O & M開發沒有系統

的 全貌如果系統的全貌是,它是在兩個地方只用了風險,你當然應該改變他們倆。完整的重新編譯和系統測試將揭示是否有其他任何內容被破壞。

+0

由於其他解決方案(如構建包裝器)不夠優雅,您在推薦此視圖? –

+1

哎呀。如果你想返回一些東西,你應該確保你能以正常的方式返回它。 –

+1

@凱文我不確定你的問題的重點。我推薦它作爲解決方案,因爲它*是解決方案。其他一切都是解決方法;根據定義,變通辦法不夠雅緻。它幾乎不需要說明。 – EJP

1

重寫deleteStuffFromDb()的簽名deleteStuffFromDb(Object returnObject)

然後寫一個包裝接口來取代舊簽名deleteStuffFromDb()

在封裝接口,這樣做:

void deleteStuffFromDb() { 
    // initialize some dummy returnObject that doesnt get used 
    deleteStuffFromDb(dummyObject); 
} 

使用這個系統,將returnObject傳遞到接口以捕獲返回值。

這樣,如果您願意,您可以選擇從接口獲取返回值,但不會破壞使用舊接口的現有調用。

+0

啊,所以我可以,例如,傳入「int returnValue」,然後在執行deleteStuffFromCache()之前檢查其值是否成功/失敗? –

+1

@Kevin不,你必須通過某種可變對象,但看到我的答案。不要構建不必要的解決方法。 – EJP

+1

@Kevin基本類型如int通過值傳遞(複製),通過引用傳遞對象(傳遞對象的引用) –

0

我不認爲改變返回類型從void到其他東西會破壞任何現有的代碼。

如果返回類型爲void,那麼使用它的任何代碼都不會期望從該方法返回任何結果。如果是的話,它也會打破。

現在,如果您更改它並從該方法返回一些值,那麼在現有代碼的情況下,返回的值將被忽略。

如果方法預期會返回某個值,但不能使用void方法,但可以做相反的操作。

我能想到的唯一情況是,如果有很多的接口實現,那麼改變它可能是一個問題。

就第二點而言,我寧願保留它所屬的邏輯。可能只是調用方法本身。

0

不知道這聲音怎麼對你很好,但我所看到的方法(例如Scanner.html#next()基於故障原因拋出NoSuchElementExceptionIllegalStateException。還有很多這樣的例子),這意味着成功的情況下拋出異常失敗例如

public void deleteStuffFromDb(){ 
     ..... usual code.. 
     if (failedCondition){ 
      throw new RuntimeErrorException(new Error("Couldn't delete")); 
     } 
} 

在來電方,如果得到拋出的異常,你可以假設,這是失敗,否則成功。這樣你可以避免改變界面。

+0

Yogendra,謝謝你的回答。我發現try/catch方法是不乾淨的。對於我來說,使用例外作爲功能是否成功的試金石似乎並不優雅。請讓我知道你的想法。 –

+0

@凱文:不知道爲什麼你覺得這是不潔的。如果你注意到,「大部分的java方法」例如字符串類的方法,整數類方法.....列表繼續,'有相同的行爲',即他們拋出異常時,有一些失敗。我在更新答案中引用了一個例子。我覺得它更像是Java核心方法中的一種模式。 –

相關問題