代码之家  ›  专栏  ›  技术社区  ›  akappa

搜索和调用带有反射的方法的开销

  •  1
  • akappa  · 技术社区  · 17 年前

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

    有30多种消息类型。

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

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

    另一种方法是使用反射:为每个messagetype定义一个函数,使用精确的签名和模式名,如processMessagetype;然后创建一个从messagetype到Method的映射(用getDeckaredMethods()上的简单搜索填充),然后执行如下操作:

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

    5 回复  |  直到 17 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    如果您希望获得良好的性能,反射会带来很大的开销。如果您的例程(消息分派)将被反复使用,那么多态性替代方案会更好。另外,在我看来,从面向对象的角度来看会更好,因为 Brian

    您处理30+条消息的CLA可以很容易地增长到100+条消息,然后您将拥有一个包含100+个方法的类,同时添加私有方法,代码重用将非常困难,您的类将变得一团糟。

    多态性和切换上的反射开销如下所示:

    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
    

        2
  •  2
  •   Tom Hawtin - tackline    17 年前

    您可以将process方法添加到枚举中。

    大开关(每种情况都只调用一个方法)到底有什么问题?

    反射的主要代价是它会使代码变得很糟糕

        3
  •  1
  •   Brian Agnew    17 年前

    我会让语言和OO系统为您工作,并使用适当的方法实现创建一个接口/抽象基类。

    Knuth )

        4
  •  1
  •   GuyBehindtheGuy    17 年前

    支配

        5
  •  0
  •   matt b    17 年前

    您描述的第二种模式基本上包括一个包含30多个方法的类,对吗?随着时间的推移,这将是一个相当痛苦的问题。