Qual è la differenza tra java.lang.Void e void?

In API

“La class Void è una class di segnaposto non affidabile per contenere un riferimento all’object Class che rappresenta la parola chiave Java void.”

  1. Qual è la class “insostenibile” dei segnaposto? Quando verrà utilizzato java.lang.Void ? Se la class è “non affidabile”, a che serve?
  2. Qual è la differenza tra java.lang.Void e void ?

L’ unico punto di Void è di mantenere Void.TYPE , che è un po ‘come void.class . Se hai un riferimento riflessivo a un metodo che restituisce void , e ottieni il suo tipo di ritorno, restituirà Void.TYPE .

Non puoi e non devi usarlo per nient’altro.

java.lang.Void è analogo a java.lang.Integer . Integer è un modo di valori di inscatolamento del tipo primitivo int . Void è un modo di valori di boxe del tipo primitivo void .

“Ma aspetta, il void non ha valori possibili!”

Destra! Questo è ciò che rende java.lang.Void “noninstantiable”. 🙂

È una buona caratteristica del sistema di tipo Java che ogni tipo primitivo ha un equivalente in scatola. int ha Integer , long ha Long , byte ha Byte … e void ha Void . Sarebbe strano e asimmetrico se Void non esistesse.

“Quindi qual è la differenza tra java.lang.Void e void ?”

Facile. void è un tipo primitivo. Void è un tipo di riferimento che eredita da Object . Sono simili nel senso che nessuno dei due ha valori possibili; ma tuttavia sono due tipi molto diversi, dal punto di vista del sistema di tipi.

“Ma non ho alcun uso per Void nei miei programmi.”

E non ho alcun uso per GarbageCollectorMXBean nella mia. Alcune funzioni non hanno usi non oscuri. Va bene.

L’uso più comune di Void è per la riflessione, ma non è l’unico posto in cui può essere usato.

void è una parola chiave che significa che una funzione non ha un valore.

java.lang.Void è un tipo di riferimento, quindi il seguente è valido:

  Void nil = null; 

(Finora non è interessante …)

Di conseguenza, type (una funzione con un valore di ritorno di type Void ) significa che la funzione * always * restituisce null (non può restituire nulla di diverso da null , perché Void non ha istanze).

  Void function(int a, int b) { //do something return null; } 

Perché mi piacerebbe una funzione che restituisce sempre null?

Prima dell’invenzione dei generici, non avevo un caso d’uso per Void .

Con i generici, ci sono alcuni casi interessanti. Ad esempio, un Future è un supporto per il risultato di un’operazione asincrona eseguita da un altro thread. Future.get restituirà il valore dell’operazione (di tipo T ) e bloccherà finché non verrà eseguito il calcolo.

Ma … E se non ci fosse nulla da restituire? Semplice: usa un Future . Ad esempio, in Google App Engine l’operazione di delete servizio Datastore asincrona restituisce un futuro . When . When get () is invoked on that future, viene restituito null` dopo che l’eliminazione è stata completata. Si potrebbe scrivere un esempio simile con Callable s.

Un altro caso d’uso è una Map senza valori, cioè una Map . Tale mappa si comporta come un Set , quindi può essere utile quando non esiste un’implementazione equivalente di Set (per esempio, non c’è WeakHashSet , quindi si potrebbe usare una WeakHashMap ).

Void è una funzione di AutoBoxing (dal momento che JDK 1.5) di vuoto.

ben si spiega da sé che il Vuoto è riferimento mentre il vuoto è un tipo primitivo.

Quindi, dove viene il requisito di dover utilizzare il vuoto ???

Un uso comune con tipi generici in cui non possiamo usare la primitiva.

Supponiamo, in caso di Android AsyncTaks cosa succede se non desidero ottenere l’aggiornamento di Progress. Non posso usare void (tipo primitivo) qui abbiamo bisogno di java.lang.Void

Void è utile perché a volte è necessario specificare il tipo di ritorno di un metodo al di fuori del metodo stesso.

Ad esempio, prendi questa espressione lambda java 8 , che controlla se un object EventResource ha determinate proprietà, utilizzando un metodo chiamato checkBenefitConcertInCentralPark , passato al metodo checkCreatedEvent :

 eventChecker.checkCreatedEvent(TestEvents::checkBenefitConcertInCentralPark); 

Il metodo checkBenefitConcertInCentralPark è definito in questo modo (notare l’uso di 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 } 

e quindi il metodo checkBenefitConcertInCentralPark viene passato al metodo checkCreatedEvent .

  // Function describes the checkBenefitConcertInCentralPark method public void checkCreatedEvent(Function function) { function.apply(this.eventResource); } 

Un altro esempio di utilizzo di Void è SwingWorker

 new SwingWorker () { @Override protected Void doInBackground(){ ... } @Override protected void process(List chunk){ ... } @Override public void done(){ ... } }.execute();