Java Void
-大文字のV-- 参照タイプ があります。私がこれまでに使用したのは、Callable
sをパラメーター化することだけです
final Callable<Void> callable = new Callable<Void>() {
public Void call() {
foobar();
return null;
}
};
Java Void
参照型の他の用途はありますか? null
以外のものを割り当てることはできますか?はいの場合、例はありますか?
Void
は、興味のない一般的な引数の規則になっています。System
など、インスタンス化できない他の型を使用する理由はありません。
また、たとえばMap
の値(Collections.newSetFromMap
はBoolean
の値を受け入れる必要がないためnull
を使用しますが)およびJava.security.PrivilegedAction
などでもよく使用されます。
数年前にVoid
に ウェブログエントリ を書きました。
リフレクションを使用して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
Future<Void>
はチャームのように機能します。 :)
パブリックコンストラクターなし があることを考えると、null
以外は割り当てられないと言えます。あなたの例が示すように、「この汎用パラメーターを使用する必要はありません」のプレースホルダーとしてのみ使用しました。
Javadoc が言っていることから、リフレクションで使用することもできます。
Voidクラスは、Javaキーワードvoidを表すClassオブジェクトへの参照を保持するインスタンス化不可能なプレースホルダークラスです。
すべてのプリミティブラッパークラス(Integer
、Byte
、Boolean
、Double
など)には、静的な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
タイプで何かをしていることがより明確になります。
余談ですが、前回試したときに BeanShell はvoid.class
を認識しなかったため、Void.TYPE
を使用する必要があります。
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;
}
}
ジェネリックの前に、他のプリミティブ型クラスに対応するvoidメソッドのMethod.getReturnType()によって返されるTYPEを保持するために、リフレクションAPI用に作成されました。
編集:VoidのJavaDocから:「Voidクラスは、Javaキーワードvoidを表すClassオブジェクトへの参照を保持するインスタンス化不可能なプレースホルダークラスです。 Genericsの前は、リフレクション以外の使用法はありません。
Voidをインスタンス化できないため、 Apache commons Null object を使用できます。
Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;
最初の行にはオブジェクトがあるので、aNullObject != null
が保持され、2行目には参照がないため、noObjectHere == null
が保持されます
ポスターの元の質問に答えるために、これの使用法は完全に異なるものである「無」と「無」を区別することです。
PS:Nullオブジェクトパターンにノーと言う
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を提供します。プリミティブ型を受け入れます
また、Attachment
オブジェクトが必要ない場合に、Async-IO完了コールバックでよく使用されます。その場合、IO操作にnullを指定し、CompletionHandler<Integer,Void>
を実装します。
まれなケースかもしれませんが、一度、アスペクトクラスで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
}
}