web-dev-qa-db-ja.com

Java Void参照タイプの使用?

Java Void-大文字のV-- 参照タイプ があります。私がこれまでに使用したのは、Callablesをパラメーター化することだけです

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

Java Void参照型の他の用途はありますか? null以外のものを割り当てることはできますか?はいの場合、例はありますか?

152
Julien Chastang

Voidは、興味のない一般的な引数の規則になっています。Systemなど、インスタンス化できない他の型を使用する理由はありません。

また、たとえばMapの値(Collections.newSetFromMapBooleanの値を受け入れる必要がないためnullを使用しますが)およびJava.security.PrivilegedActionなどでもよく使用されます。

数年前にVoidウェブログエントリ を書きました。

109

リフレクションを使用してVoidのインスタンスを作成できますが、これらは何の役にも立ちません。 Voidは、ジェネリックメソッドが何も返さないことを示す方法です。

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

のようなものを印刷します

I have a Java.lang.Void@75636731
47
Peter Lawrey

Future<Void> はチャームのように機能します。 :)

27

パブリックコンストラクターなし があることを考えると、null以外は割り当てられないと言えます。あなたの例が示すように、「この汎用パラメーターを使用する必要はありません」のプレースホルダーとしてのみ使用しました。

Javadoc が言っていることから、リフレクションで使用することもできます。

Voidクラスは、Javaキーワードvoidを表すClassオブジェクトへの参照を保持するインスタンス化不可能なプレースホルダークラスです。

19
Michael Myers

すべてのプリミティブラッパークラス(IntegerByteBooleanDoubleなど)には、静的なTYPEフィールドに対応するプリミティブクラスへの参照が含まれます。 、 例えば:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Voidは、最初にvoid型への参照を置く場所として作成されました。

Void.TYPE == void.class

ただし、Void.TYPEを使用しても実際には何も得られません。 void.classを使用すると、voidタイプで何かをしていることがより明確になります。

余談ですが、前回試したときに BeanShellvoid.classを認識しなかったため、Void.TYPEを使用する必要があります。

16
Luke Woodward

visitor pattern を使用する場合、戻り値がnullであることを確認したい場合は、Objectの代わりにVoidを使用する方がクリーンです。

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

ビジターを実装する場合、明示的にOUTをVoidに設定すると、ビジターがObjectを使用する代わりに常にnullを返すことがわかります。

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}
6

ジェネリックの前に、他のプリミティブ型クラスに対応するvoidメソッドのMethod.getReturnType()によって返されるTYPEを保持するために、リフレクションAPI用に作成されました。

編集:VoidのJavaDocから:「Voidクラスは、Javaキーワードvoidを表すClassオブジェクトへの参照を保持するインスタンス化不可能なプレースホルダークラスです。 Genericsの前は、リフレクション以外の使用法はありません。

5
Lawrence Dol

Voidをインスタンス化できないため、 Apache commons Null object を使用できます。

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

最初の行にはオブジェクトがあるので、aNullObject != nullが保持され、2行目には参照がないため、noObjectHere == nullが保持されます

ポスターの元の質問に答えるために、これの使用法は完全に異なるものである「無」と「無」を区別することです。

PS:Nullオブジェクトパターンにノーと言う

3
Mar Bar

Voidは、そのプリミティブなvoid型をラップするために作成されます。すべてのプリミティブ型には、対応する参照型があります。 Voidは、ジェネリッククラスまたはジェネリックメソッドの使用をインスタンス化するために使用されます。

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

ここでわかるように、新しい登録を作成するように求めているサーバーから何も望んでいませんが、public interface AsyncCallback<T> { .... }はジェネリックインターフェイスなので、ジェネリックはしないのでVoidを提供します。プリミティブ型を受け入れます

1
Adelin

また、Attachmentオブジェクトが必要ない場合に、Async-IO完了コールバックでよく使用されます。その場合、IO操作にnullを指定し、CompletionHandler<Integer,Void>を実装します。

0
eckes

まれなケースかもしれませんが、一度、アスペクトクラスでVoidを使用しました。

これは、@Logアノテーションを持つメソッドの後に実行され、返されたメソッドと、メソッドの戻り値の型がvoidでない場合に情報を記録するアスペクトでした。

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
0
Alireza Fattahi