2013-07-16 26 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()。每个实现类将以自己的方式覆盖该方法。