Cosa devo restituire se il tipo di restituzione di un metodo è Void? (Non vuoto!)


115

A causa dell'utilizzo di Generics in Java ho finito per dover implementare una funzione avente Voidcome tipo di ritorno:

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

e il compilatore richiede che io restituisca qualcosa . Per ora sto solo tornando null, ma mi chiedo se sia una buona pratica di codifica ...

Sto chiedendo V ‌oid, non v ‌oid. La classe Void, non la parola chiave riservata void.

Ho anche provato Void.class, void, Void.TYPE, new Void(), nessun ritorno a tutti, ma tutto ciò che non funziona affatto. (Per ragioni più o meno ovvie) (Vedi questa risposta per i dettagli)

  • Quindi cosa dovrei restituire se il tipo di ritorno di una funzione è Void?
  • Qual è l'uso generale della Voidclasse?

Risposte:


104

Quindi cosa dovrei restituire se il tipo di ritorno di una funzione deve essere Void?

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

Qual è il punto Void?

Come notato sopra, è un segnaposto. Voidè ciò che otterrai se, ad esempio, utilizzi la reflection per esaminare un metodo con un tipo restituito di void. (Tecnicamente, tornerai Class<Void>.) Ha altri usi assortiti in questo senso, come se si desidera parametrizzare un file Callable<T>.

A causa dell'uso di generici in Java, ho finito per dover implementare questa funzione

Direi che qualcosa potrebbe essere strano con la tua API se avessi bisogno di implementare un metodo con questa firma. Considera attentamente se esiste un modo migliore per fare ciò che desideri (forse puoi fornire maggiori dettagli in una domanda di follow-up diversa?). Sono un po 'sospettoso, dal momento che è emerso solo "a causa dell'uso di farmaci generici".


13
Dover restituire Void non è poi così strano, dopotutto. Può essere semplicemente imposto da, ad esempio, Callable <T>. A volte non è necessario restituire qualcosa ma non è possibile utilizzare ad esempio Runnable.
Bombe

Void ha usi legittimi, come ho notato. Ma ha detto che "questo è dovuto solo all'uso di generici". Ciò fa sembrare che abbia fatto qualcosa a una collezione che deve usare Void, che direi è un caso piuttosto eccezionale.
John Feminella

Con le collezioni sarebbe davvero molto strano.
Bombe

Sia Void.class che void.class sono Class <Void> ma non sono uguali. Void è spesso usato come argomento generico nel valore di Map (o usa Collections.newSetFromMap) e return di AccessController.doPrivileged.
Tom Hawtin - tackline

@ Tom: Yeppers. Ecco perché ho etichettato "(Tecnicamente, tornerai alla classe <Void>.)" Devo modificare quella parte o pensi che sia accurata così com'è?
John Feminella

26

Non c'è modo di istanziare un Void, quindi l'unica cosa che puoi restituire è null.


13
Più precisamente, non c'è modo di istanziare un Vuoto senza fare cose malvagie.
Michael Myers

20

return null è la strada da percorrere.


20

Per chiarire perché gli altri suggerimenti che hai fornito non funzionano:

Void.classe Void.TYPEindicano lo stesso oggetto e sono di tipo Class<Void>, non di Void.

Ecco perché non puoi restituire quei valori. new Void()sarebbe di tipo Voidma quel costruttore non esiste. Infatti, Voidnon ha costruttori pubblici e quindi non può essere istanziato: non si può mai avere alcun oggetto di tipo Voideccetto il polimorfico null.

Spero che questo ti aiuti! :-)


1
Correzione minore: Void.TYPEnon punta a Void.class. Indica void.class.
shmosel

1

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


Non sarò un MUST; è solo una convenzione.
Tom Hawtin - tackline

-2

proprio come questo.

public Class TestClass {
    public void testMethod () {
        return;
    }
}

2
L'OP ha detto Void, no void. Le altre risposte sembrano già coprire abbastanza bene l'argomento.
E_net4 rimane lontano da Meta
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.