JDK的界面是否如下所示:
public interface Callback<T> {
public void process(T t);
}
要求是实现运行代码的回调,但不返回任何内容。
我可以编写自己的(通过简单地使用这里的示例代码),但我想使用现有的轮子,如果存在,而不是重新发明。
答案 0 :(得分:10)
所以你需要像
这样的东西interface Foo<T>
bar(T)
JDK中只有3个接口就是那个
java.nio.file.DirectoryStream$Filter<T>
boolean accept(T entry) throws IOException;
java.lang.Comparable<T>
int compareTo(T o);
javax.xml.ws.Provider<T>
T invoke(T request);
显然你不会喜欢他们。
Async IO有一个回调接口,但它有点复杂:
java.nio.channels.CompletionHandler<V,A>
void completed(V result, A attachment);
void failed(Throwable exc, A attachment);
答案 1 :(得分:4)
不,我不相信目前有这样的界面。在JDK 8中,目前预计会出现这样一个名为Block
(带apply
方法的接口),但名称可能会在现在和将来之间发生变化。
答案 2 :(得分:3)
这看起来像Guava的Function
,除了允许函数返回一些东西。因此它看起来像
public interface Callback<T> extends Function<T, Void> {
}
不是JDK的一部分,但现在Guava非常常用,您可能会觉得它很方便。
答案 3 :(得分:2)
真正的问题是为什么?为什么您认为为此定义接口比使用Java提供的接口更糟糕?你会得到什么?您将无法选择适当的名称。我认为就是这样。如果您有理由使用Java库提供的现有接口,那么已经知道其名称,因为您将知道您计划与哪个库接口。 使用一种方法创建界面并不是重新发明轮子。
答案 4 :(得分:2)
根据我的经验,JDK中没有这样的界面。泛型只出现在Java游戏的后期。在此之前,需要以半类型安全的方式将几个类型化的参数传递给回调,而不需要事先了解这些参数结构(我说“半类型安全”,因为发明了事件监听器来测试事件的类型并按需要投射)。如果没有泛型,您就无法构建该机制,并且他们从未重新构建整个JDK以考虑泛型(除了集合API和其他一些)。这将是一项巨大的任务,收益甚微(毕竟, 的所有工作都按预期工作)。
因此,观察者/监听器模式在JDK库上普遍存在(参见java.util.EventObject
,java.util.EventListerner
及其用法)。在实现EventListener
时,Java还认为在接口定义期间更加冗长。为了更清晰的实现,该模式的专门实现应该使回调方法名称演示代码的目的(通常也匹配事件的名称)。例如,ActionEvent#actionPerformed(ActionEvent e)
。
缺少该接口的另一个可能原因是它不在JDK本身中使用。有时你希望Callback<T>
或Callback<T, V>
等Callback<T, R, V>
其他人,等等。提供那些没有任何实际的接口的用例(在JDK内部)实际上不是一个非常设计的策略。缺乏对这些有用结构的支持是Guava和Apache Commons(以及其他)存在的主要原因。
无论如何,我同意@JB Nizet你应该使用番石榴。我们没有说明你使用界面的原因和方式,因此留下了很大的推测空间,但无论如何,Guava可能还有其他可能派上用场的功能。
答案 5 :(得分:1)
如果您要应用Observer设计模式,Java自JDK 1.0以来就在其标准库中支持它。您正在寻找的接口是java.util.Observer。模式的另一面是java.util.Observable类。基本上,你扩展java.util.Observable,然后注册你的Observers(据我所知,Observer可以同时观察多个Observable)。这是非常古老的东西,所以要注意:没有泛型。
答案 6 :(得分:1)
我使用Callable(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Callable.html)在java中实现回调/仿函数。
interface Callable<V> {
public V call();
}
您可以使用java.util.concurrent中的Executors来处理它。
答案 7 :(得分:1)
在Java 8中,the java.util.function.Consumer
class完全符合您的要求。
它有一个非默认方法,它接受泛型类型并且不返回任何内容:
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
// ...
}
}
答案 8 :(得分:0)
它被称为注释处理。 JSR 269: Pluggable Annotation Processing API定义了API,它是JDK 6的一部分。您可以从here和here开始。