我正在开发一个集群框架,我有以下界面 为了提供在集群中的另一个节点上执行一段代码的方法:
interface Operation<V> {
V run();
int getService();
}
但是,用户可能不关心操作的结果。 在这种情况下,我需要为他们提供一种方便的方法。我有两个选择:
我可以告诉他们使用java.lang.Void作为参数并检查远程服务器中的返回类型,如果泛型类型不是Void则返回结果:
new Operation<Void> {
public Void run() {
//
return null;
}
public int getService() { return 1; }
}
但是,即使他们使用java.lang.Void, 他们仍然需要在run方法中返回一些东西 做这样的事情可能不是一个好方法。
此外,我可以创建另一个不返回任何内容的界面。 但是,现在我们有两种类型,我担心它比第一种方式更复杂。
interface FireAndForgetOperation {
void run();
int getService();
}
您认为哪种方式更方便?
答案 0 :(得分:1)
我肯定会做这样的事情,以避免暴露出不必要的东西:
public interface Operation<V> {
V run();
public int getService();
}
abstract public class VoidOperation implements Operation<Void> {
public final Void run() {
runVoid();
return null;
}
abstract public void runVoid();
abstract public int getService();
}
用法:
new Operation<String>() {
public String run() {
return null;
}
public int getService() { return 1; }
};
new VoidOperation() {
public void runVoid() {
}
public int getService() { return 1; }
};
答案 1 :(得分:1)
我认为你的第一种方法很方便。它在一些java库中使用。一个例子是JavaFX中的Callback接口(https://docs.oracle.com/javafx/2/api/javafx/util/Callback.html)。 需要使用回调并且确实需要任何返回值的代码将回调声明为:
CallBack<SomeClass, Void> myCallBack;
在call方法中,返回null;