2

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

我有 50 个对象,每个对象我需要执行一个函数并将这个对象传递给该函数。这意味着if else我的代码中有 50 条语句。

我使用 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

4 回答 4

6

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

正如您在评论中提到的,您已经拥有这个公共基类,因此可以abstract在您的类中定义该方法Packet

于 2013-07-16T16:21:30.183 回答
3

理想情况下,您可以让所有 50 个对象的类都实现一个RunAfterDeserialize带有runAfterDeserialize方法的公共接口,这样您就可以将对象强制转换为 aRunAfterDeserialize并执行它的runAfterDeserialize方法。

除此之外,创建一个抽象RunAfterDeserialize类并创建 50 个具有自己的runAfterDeserialize方法实现的子类,对应于您拥有的 50 种不同的对象类型(例如FooVORunAfterDeserialize, BarVORunAfterDeserialize)。现在创建一个Map<Class, RunAfterDeserialize>,您可以在其中获得object.getClass()五十个对象的密钥。然后你可以执行适当的方法

Map<Class, RunAfterDeserialize> map;
Packet packet =  (Packet) gson.fromJson(msg, cls);
map.get(packet.getClass()).runAfterDeserialize(packet);
于 2013-07-16T16:23:01.833 回答
1

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

于 2013-07-16T16:21:51.213 回答
1

如果您希望您的处理代码与各种Packet实现分离,那么您正在寻找访问者模式。

于 2013-07-16T16:30:27.750 回答