Java Rich Enum类型:使用函数对象与常量特定方法指定常量特定行为

时间:2013-08-02 04:22:54

标签: java methods enums

在Java中,函数对象是无状态对象(通常是实现策略接口的单例)的实例,其方法对其他对象的状态进行操作。这些Java相当于将函数指针作为方法的参数传递,就像在C语言中那样。

1.5中引入的Java Enum规范使程序员能够通过在enum声明中将策略“interface”指定为一系列抽象方法声明来复制Function Object模式,然后必须为每个枚举常量实现。

因此,如果想要将常量特定行为与枚举常量相关联,则至少有两种选择:

  • 您可以首先Enum声明implement您的策略界面,然后将该行为存储为最终enum实例字段中的函数对象。然后,客户端代码可以通过enum字段访问器方法调用该行为。

  • 您可以将“策略”声明为abstract声明中的一个或多个Enum方法。编译器会坚持为每个enum常量实现这些。然后,客户端代码可以通过enum常量直接调用该方法来调用该行为。

在我看来,功能对象方法需要更多资源。需要在堆上分配对象,对于大的枚举,这可能是一些对象。通过访问器调用的需要似乎需要较慢的执行,但是我猜想现代的JVM实现足够聪明,可以在线调用方法调用,从而使两种模式之间的执行速度相似。

我目前使用函数对象来为我编写的JDBC数据库应用程序指定“动态”元数据。这些对象描述了数据库的某些功能,例如列和行不变量,用于创建对应于枚举类的数据模型对象的工厂,用于获取和改变数据模型对象数据的访问器以及其他类似的元数据。

这种方法确实需要很多样板。很多样板。

虽然使用特定于常量的方法并不能消除样板,但这种方法应该更简洁,更易读......并且可能更有效。

我应该重构我的枚举设计以使用常量特定的方法来代替函数对象吗?

1 个答案:

答案 0 :(得分:1)

  

我应该重构我的枚举设计以使用常量特定的方法来代替函数对象吗?

如果您关心enum方法调用的性能和额外的参考成本(最多10纳秒),您根本不应该在关键路径中使用数据库。数据库访问通常为10,000,000纳秒。即使您已经拥有的查询的行访问也可以是10,000纳秒。 Java Chronicle的设计是超轻量级,GC少,无锁,低系统调用,数据持久性,甚至可以在100到500纳秒的数量级内持续存储并重新读取一些较大的业务对象。 / p>

简而言之,你必须弄清楚哪个比例对你很重要,并首先开始优化最大的击球手。这意味着使用商业分析器分析您的应用程序,当分析器放弃并说您没有创建任何垃圾而不使用任何CPU或点击任何数据库时,您才应该开始担心成本取消引用和使用对象来保存函数。