web-dev-qa-db-ja.com

Voidオブジェクトを返す

プリミティブではない場合、Void型を返す正しい方法は何ですか?例えば。現在、以下のようにnullを使用しています。

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}
99
Robert

Voidクラスは、Javaキーワードvoid。

したがって、次のいずれかで十分です。

  • Objectでパラメーター化し、new Object()またはnullを返す
  • Voidでパラメーター化し、nullを返す
  • NullObjectを使用したパラメータ化

このメソッドをvoidにすることはできません。他のメソッドはsomethingを返します。その何かは無視されるので、何でも返すことができます。

120
Bozho

Java 8では、新しいクラスOptional<T>、このような場合に使用できます。これを使用するには、次のようにコードをわずかに変更します。

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}

これにより、返されるものが何もない場合でも、メソッドからalways null以外の戻り値を取得できます。 nullを返すことができるかできないかを検出するツールと組み合わせて使用​​すると、特に強力です。 Eclipse @NonNullおよび@Nullable注釈。

12

タイプとして何も必要ない場合は、voidを使用できます。これは、機能またはアクションの実装に使用できます。次のようなことができます:

interface Action<T> {
    public T execute();
}

abstract class VoidAction implements Action<Void> {
    public Void execute() {
        executeInternal();
        return null;
    }

    abstract void executeInternal();
}

または、抽象クラスを省略して、自分で戻り値を必要としないすべてのアクションでnullを返すこともできます。

その後、次のようなアクションを使用できます。

与えられた方法

private static <T> T executeAction(Action<T> action) {
    return action.execute();
}

あなたはそれを次のように呼ぶことができます

String result = executeAction(new Action<String>() {
    @Override
    public String execute() {
        //code here
        return "Return me!";
    }
});

または、voidアクションの場合(結果を何にも割り当てないことに注意してください)

executeAction(new VoidAction() {
    @Override
    public void executeInternal() {
        //code here
    }
});
3
Jorn

メソッドが何も返さないことをコンパイラに通知するジェネリック型はありません。

慣習は、型パラメーターとして継承するときにオブジェクトを使用することだと思います

OR

型パラメーターを上に伝搬し、クラスのユーザーがObjectを使用してインスタンス化し、type-wildcard ?

interface B<E>{ E method(); }

class A<T> implements B<T>{

    public T method(){
        // do something
        return null;
    }
}

A<?> a = new A<Object>();
0