gpt4 book ai didi

java - 使用反射搜索和调用方法的开销

转载 作者:行者123 更新时间:2023-11-29 06:26:03 24 4
gpt4 key购买 nike

我有一个类应该读取一条消息,从信封中提取它的类型,然后调用一个必须处理消息的方法;每种消息类型都关联一个枚举成员。

有 30 多种消息类型。

发送消息的一种方法是只使用一个开关,但它真的很难看并且容易出错(我已经处理过那个案例了吗?我已经处理过两次了吗?)。

另一种方法是使用单一方法 process(data) 定义一个接口(interface),并为实现该接口(interface)的每个消息类型创建一个类,使用映射注册这些类,并且在应该处理消息的代码中,只需调用 map.get(messageType).process(data);但是创建 30 多个类真的很烦人。

另一种方法是使用反射:为每个消息类型定义一个函数,具有精确的签名和模式名称,如 processMessagetype;然后创建一个从 messagetype 到 Method 的映射(填充了对 getDeckaredMethods() 的简单搜索),然后执行如下操作:map.get(messageType).invoke(this,data).

你应该使用什么方法?使用java的反射有什么开销?

最佳答案

如果您正在寻找良好的性能,反射会带来很大的开销。如果您的例程(消息调度)将被一遍又一遍地使用,多态性替代方案会更好。此外,IMO 如果从 OO 的角度来看会更好,因为如 Brian 所述根据他的回答,维护起来更容易也更便宜。

处理 30 多条消息的类很容易增长到 100 多条消息,然后你将拥有一个包含 100 多个方法的类,还要添加私有(private)方法,代码重用将变得困难,你的类就会变得一团糟。

反射对多态和开关的开销是这样的:

time spent on a switch case call: 1
time spent on a polymorphism call: 1.1
time spent on a reflection call: 1.9-2.0

我不久前对这些人进行了基准测试,那是我的结果,我现在没有代码,因为这些基准测试是在我以前的公司完成的,我无法再访问该代码。

关于java - 使用反射搜索和调用方法的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/793568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com