对于没有返回任何内容的类,使用java.lang.Void是否方便?

时间:2014-11-23 13:09:27

标签: java design-patterns

我正在开发一个集群框架,我有以下界面 为了提供在集群中的另一个节点上执行一段代码的方法:

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();
}

您认为哪种方式更方便?

2 个答案:

答案 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;