我正在编写一个接收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多次使用的方法!
谢谢!
答案 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就是您正在寻找的内容。