2013-07-16 54 views
2

我正在寫一個Java應用程序接收Json編碼的對象時,當我解碼它回到一個對象我需要執行適當的相關對象的相關函數。執行功能的對象類型,而不是使用if else else else

我有50個對象和每個對象我需要執行一個函數並將該對象傳遞給該函數。這意味着我的代碼中有50個if else語句。

我使用google-gson將json字符串解碼回對象。

Gson gson = new Gson(); 
    Packet packet = (Packet) gson.fromJson(msg, cls); 

,然後我有

if (packet instanceof FooVO) { 
      func1(packet); 
    } else if (packet instanceof BarVO) { 
      func2(packet); 
    } 
    ... 

等等...

現在我不是在Java中,所以我不知道該專家有什麼辦法,如果縮短這些/ else語句,並以某種方式創建一個類,它的功能是基於對象類型並根據返回的對象類型調用函數?

任何方法,將保存我使用,如果其他很多次在我的代碼!

謝謝!

+0

數據包是一個抽象類,所有其他類從它繼承 – ufk

+0

哎呀是啊它的包 – ufk

回答

3

理想的情況下你能有所有五十個對象的類實現共同RunAfterDeserialize接口與runAfterDeserialize方法,這樣就可以把對象的RunAfterDeserialize並執行其runAfterDeserialize方法。

除非是創建一個抽象類RunAfterDeserialize並創造50子類用自己的runAfterDeserialize方法實現,相當於你有五十種不同的對象類型(例如FooVORunAfterDeserializeBarVORunAfterDeserialize)。現在創建一個Map<Class, RunAfterDeserialize>,您可以通過object.getClass()獲得五十個對象的密鑰。然後你就可以。如果你想從不同的Packet實現分離的處理代碼

Map<Class, RunAfterDeserialize> map; 
Packet packet = (Packet) gson.fromJson(msg, cls); 
map.get(packet.getClass()).runAfterDeserialize(packet); 
6

最簡單的方法就是讓所有可能的類實現相同的接口,並在其中定義一個abstract方法。從Json中讀取對象後,您只需調用packet.func();並將實現細節留給不同的類本身。

正如您在評論中提到的,您已經擁有此通用基類,因此可以在您的Packet類中定義abstract方法。

1

我相信你可以有一個接口與該方法method()和所有其他類實現該接口的方法。然後,一旦您從JSON獲取對象,就可以將該方法調用爲packet.method()。每個實現類將以自己的方式覆蓋該方法。