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
以外のものを返すことはできません)。null
Void
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
操作は将来の. When
get()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);
}