APIで
「Voidクラスは、Javaキーワードvoidを表すClassオブジェクトへの参照を保持するためのインスタンス化できないプレースホルダークラスです。」
- 「インスタンス化できない」プレースホルダークラスとは何ですか?いつ
java.lang.Void使用されますか?クラスが「インスタンス化できない」場合、それはどのような用途ですか? java.lang.Voidとの違いは何voidですか?
java.lang.Voidに類似していjava.lang.Integerます。Integerプリミティブ型の値をボックス化する方法ですint。Voidプリミティブ型の値をボックス化する方法ですvoid。
「しかし、待ってください、void可能な値はありません!」
右!それがjava.lang.Void「インスタンス化不可能」なのです。:)
すべてのプリミティブ型に同等のボックスが含まれているのは、Java型システムの優れた機能です。int持っているInteger、long持っているLong、byte持っているByte...そしてvoid持っているVoid。Void 存在しなかった場合、それは奇妙で非対称になります。
java.lang.Void「では、との違いは何voidですか?」
簡単。voidプリミティブ型です。Voidから継承する参照型ですObject。それらはどちらも可能な値を持たないという点で似ています。しかし、それにもかかわらず、型システムの観点からは、これらは2つの非常に異なるタイプです。
Void「しかし、私は自分のプログラムで何の役にも立ちません。」
そして、私は私の中で何の役にも立ちませんGarbageCollectorMXBean。一部の機能には、わかりにくい用途がありません。大丈夫。
の最も一般的な使用法Voidは反射ですが、それが使用される可能性があるのはそれだけではありません。
void関数が値を生成しないことを意味するキーワードです。
java.lang.Voidが参照型の場合、以下が有効です。
Void nil = null;
(これまでのところ、面白くありません...)
結果としてタイプ(戻り値がタイプVoidの関数)は、関数が*常に*リターンすることを意味します(インスタンスがないため、null以外のものを返すことはできません)。nullVoid
Void function(int a, int b) {
//do something
return null;
}
常にnullを返す関数が必要なのはなぜですか?
ジェネリックスが発明される前は、のユースケースはありませんでしたVoid。
ジェネリックスでは、いくつかの興味深いケースがあります。たとえば、aFuture<T>は、別のスレッドによって実行された非同期操作の結果のホルダーです。Future.get(タイプの)操作値を返し、T計算が実行されるまでブロックします。
しかし...戻るものがない場合はどうなりますか?シンプル:を使用しFuture<Void>ます。たとえば、Google App Engineでは、Asyncronous Datastore Servicedelete操作は将来の. Whenget()is invoked on that future,null`を返し、削除が完了した後に返されます。Callableを使って同様の例を書くことができます。
別のユースケースは、Map値なし、つまりMap<T,Void>。です。このようなマップはのように動作しSet<T>、同等の実装がない場合に役立つ場合がありSetます(たとえば、がない場合はWeakHashSet、を使用できますWeakHashMap<T,Void>)。
の唯一のポイントはVoid、を保持することです。Void.TYPEこれは、のようなものvoid.classです。を返すメソッドへのリフレクティブ参照があり、voidその戻り型を取得すると、が返されますVoid.TYPE。
それを他の目的に使用することはできませんし、使用すべきではありません。
Voidは、voidのAutoBoxing機能(JDK 1.5以降)です。
ボイドは参照であるのに対し、ボイドはプリミティブ型であることは自明です。
したがって、要件がVoidを使用する必要がある場合は???
プリミティブを使用できないジェネリック型での一般的な使用法の1つ。
たとえば、Androidの場合、
AsyncTaks<Params, Progress, Result>Progressアップデートを取得したくない場合はどうなりますか。ここではvoid(プリミティブ型)を使用できません。java.lang.Voidが必要です。
使用する別の例VoidはSwingWorker
new SwingWorker<Void, Integer> () {
@Override
protected Void doInBackground(){
...
}
@Override
protected void process(List<Integer> chunk){
...
}
@Override
public void done(){
...
}
}.execute();
Voidは、メソッド自体の外部でメソッドの戻り型を指定する必要がある場合があるため、便利です。
たとえば、次のjava 8ラムダ式checkBenefitConcertInCentralParkを使用します。この式は、メソッドに渡された、というメソッドを使用して、EventResourceオブジェクトに特定のプロパティがあるかどうかをチェックしますcheckCreatedEvent。
eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark);
メソッドは次のcheckBenefitConcertInCentralParkように定義されます(Voidの使用に注意してください)。
public static Void checkBenefitConcertInCentralPark(EventResource eventResource) {
// JUnit code here...
// assertThat(blablabla :) )
return null; // we can only return null at the end of a method when returning Void
}
次に、checkBenefitConcertInCentralParkメソッドがメソッドに渡されcheckCreatedEventます。
// Function<EventResource, Void> describes the checkBenefitConcertInCentralPark method
public void checkCreatedEvent(Function<EventResource, Void> function) {
function.apply(this.eventResource);
}