2009-03-24 7 views
109

Grazie all'uso dei farmaci generici in Java ho finito nel dover implementare una funzione che ha Void come tipo di ritorno:Cosa restituisco se il tipo di restituzione di un metodo è Void? (Non invalidare!)

richieste
public Void doSomething() { 
    //... 
} 

e il compilatore che torno qualcosa. Per ora sto solo tornando null, ma mi chiedo se questo è buona pratica di codifica ...

Ho anche provato Void.class, void, Void.TYPE, new Void(), nessun ritorno a tutti, ma tutto ciò che doesn' lavorare affatto (Per ragioni più o meno evidenti) (Vedere this answer per i dettagli)

  • Allora cosa dovrei tornare se il tipo di ritorno di una funzione è Void?
  • Qual è l'uso generale della classe Void?

EDIT: Giusto per risparmio i downvotes: Sto chiedendo V OID, non v OID. La classe Void, non, la parola chiave riservata void.

risposta

98

Allora cosa dovrei tornare se il tipo di ritorno di una funzione deve essere Void?

Utilizzare return null. Void non può essere istanziato ed è semplicemente un segnaposto per il tipo Class<T> di void.

Qual è il punto di Void?

Come indicato sopra, è un segnaposto. Void è ciò che si otterrà se, ad esempio, si utilizza la riflessione per esaminare un metodo con un tipo di ritorno void. (Tecnicamente, tornerai a Class<Void>.) Ha altri usi assortiti lungo queste linee, come se volessi parametrizzare uno Callable<T>.

Grazie all'uso dei farmaci generici in Java ho finito nel dover implementare questa funzione

direi che qualcosa può essere funky con la vostra API se è necessario implementare un metodo con questo firma. Valuta attentamente se esiste un modo migliore per fare ciò che vuoi (forse puoi fornire maggiori dettagli in una domanda di follow-up diversa?).Sono un po 'sospettoso, dal momento che questo è emerso solo "a causa dell'uso di farmaci generici".

+11

Dover restituire Void non è poi così eccentrico. Può semplicemente essere richiesto da ad es. Callable . A volte semplicemente non è necessario restituire qualcosa ma non è possibile utilizzarlo, ad es. Runnable. – Bombe

+0

Il vuoto ha usi legittimi, come ho notato. Ma ha detto che "questo è venuto solo a causa dell'uso di farmaci generici". Questo fa sembrare che abbia fatto qualcosa per una collezione che ha bisogno di usare Void, il che direi che è un caso piuttosto eccezionale. –

+0

Con le collezioni sarebbe molto strano, infatti. – Bombe

18

return null è la strada da percorrere.

0

Se, per motivi oscuri, DEVI utilizzare questo tipo, quindi restituire null sembra essere un'opzione ragionevole, poiché suppongo che il valore di ritorno non verrà comunque utilizzato.
Il compilatore ti costringerà a restituire comunque qualcosa.
E questa classe non sembra avere un costruttore pubblico, quindi il nuovo Void() non è possibile.

+0

Non sarò un MUST; è solo una convenzione. –

23

Non esiste alcun modo per creare un'istanza di un annullamento, quindi l'unica cosa che è può restituire è nullo.

+13

Più precisamente, non c'è modo di creare un'istanza di un vuoto senza fare cose malvagie. –

17

per rendere chiaro il motivo per cui gli altri suggerimenti hai dato non funzionano:

Void.class e Void.TYPE punto allo stesso oggetto e sono di tipo Class<Void>, non di Void.

Ecco perché non è possibile restituire quei valori. new Void() sarebbe di tipo Void ma tale costruttore non esiste. Infatti, Void non ha costruttori pubblici e quindi non può essere istanziato: non si può mai avere alcun oggetto di tipo Void ad eccezione del polimorfico null.

Spero che questo aiuti! :-)

+0

Correzione minima: 'Void.TYPE' non punta a' Void.class'. Punta a 'void.class'. – shmosel