Java中导出函数对象的最佳实践是什么?

6
在Java中,创建“函数对象”(一种无状态对象,出口单个方法,该方法可用于其他对象)的最佳实践是什么?

1
你可以通过查看Comparator接口来获得一些灵感:http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html。这是一个开放性问题。 - Christophe Roussy
4个回答

5

看一下即将发布的Java 8功能接口是很有启发性的(链接)

Java 8类库中有一个新包,java.util.functions,其中包含几个新的函数接口。其中许多可以与Collections API一起使用。

如果您遵循此处展示的模式,您将拥有一个函数接口(支持一个方法的接口)和一个没有成员的实现。您的函数对象不应调用任何可能改变其状态(即表现出副作用)的方法参数上的方法。不幸的是,您无法强制执行这一点-您必须依靠惯例来实现。


这个能用函数式语言来实现吗? - Geek
我相信强制不变性的语言可以实现这一点。也许还包括 C++ 和其强大的常数语义,但我宁愿不被引用! - Brian Agnew

3

Java是一种面向对象的编程语言,因此使用策略设计模式。


1
虽然在这里策略很有用,但实现只有一个方法的情况下不需要策略对象,因为函数对象就足够了。 - Brian Agnew

2
Java8应该有Lambda表达式来方便创建函数式接口实现。在Java8之前,您可以查看Guava库所提供的内容:Functional Explained
以下是文档的摘录:
Guava提供了两个基本的“functional”接口: Function,它有单一的方法B apply(A input)。Function的实例通常应该是引用透明的-没有副作用,并且与equals一致,也就是说,a.equals(b)意味着function.apply(a).equals(function.apply(b))。 Predicate,它有单一的方法boolean apply(T input)。Predicate的实例通常应该是无副作用并且与equals一致。

0

好的,在评论后,这里有一个答案:

没有一种简单/方便的方法来传递函数。

大多数情况下,您将声明一个实现接口的内部类,例如Comparatorhttp://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

函数无法作为参数传递的事实引发了许多所谓的设计模式,其中您会传递声称具有这些函数的对象类/接口。

正如其他人所提到的,使用Java 8会变得更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接