按对象类型执行函数,而不是使用if else else if

时间:2013-07-16 16:16:27

标签: java

我正在编写一个接收Json编码对象的Java应用程序,当我将其解码回对象时,我需要执行适合相关对象的相关函数。

我有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的专家所以我想知道有没有办法缩短这些if / else语句并以某种方式创建一个类,它的函数基于对象类型并调用基于的函数返回的对象类型?

任何可以在我的代码中使用if else多次使用的方法!

谢谢!

4 个答案:

答案 0 :(得分:6)

最简单的方法是让所有可能的类实现相同的接口,并在其中定义abstract方法。从Json读取对象后,您只需要调用packet.func();并将实现细节留给不同的类本身。

正如您的评论中所述,您已经拥有此公共基类,因此可以在abstract类中定义Packet方法。

答案 1 :(得分:3)

理想情况下,您可以让所有50个对象的类使用RunAfterDeserialize方法实现公共runAfterDeserialize接口,以便您可以将对象强制转换为RunAfterDeserialize并执行它的runAfterDeserialize方法。

除此之外,创建一个抽象的RunAfterDeserialize类并使用自己的runAfterDeserialize方法实现创建50个子类,对应于您获得的50种不同的对象类型(例如FooVORunAfterDeserialize,{ {1}})。现在创建一个BarVORunAfterDeserialize,您可以通过Map<Class, RunAfterDeserialize>为您的五十个对象获取密钥。然后,您可以使用

执行适当的方法
object.getClass()

答案 2 :(得分:1)

我相信你可以拥有一个与该方法method()的接口以及实现该接口方法的所有其他类。然后,一旦从JSON获得对象,就可以将该方法称为packet.method()。每个实现类都将以自己的方式覆盖该方法。

答案 3 :(得分:1)

如果您希望处理代码与各种Packet实施方式分离,visitor pattern就是您正在寻找的内容。