2010-03-09 16 views
72

Qual è il modo corretto per restituire un tipo Void, quando non è un primitivo? Per esempio. Attualmente utilizzo null come di seguito.restituire un oggetto Void

interface B<E>{ E method(); } 

class A implements B<Void>{ 

    public Void method(){ 
     // do something 
     return null; 
    } 
} 
+1

per cosa ti serve? – Bozho

+1

sto scrivendo un interprete per un formato di file, usando lo schema dell'interprete, ma alcune espressioni non hanno valori di ritorno – Robert

+2

Non c'è modo di creare un'istanza del tipo Void, quindi se davvero devi restituire qualcosa di quel tipo, null è la tua unica opzione. Tuttavia, probabilmente non hai bisogno del valore restituito per qualcosa, quindi null dovrebbe andare bene. – Jorn

risposta

92

La classe Void è una classe segnaposto istanziabili di tenere un riferimento all'oggetto classe che rappresenta la parola chiave void Java.

Così una delle seguenti sarebbe sufficiente:

  • parametrizzazione con Object e tornando new Object() o null
  • parametrizzazione con Void e tornando null
  • parametrizzazione con un NullObject tuo

Non è possibile effettuare questo metodo void e qualsiasi altra cosa restituisce qualcosa. Dal momento che quel qualcosa viene ignorato, puoi restituire qualsiasi cosa.

+2

allora qual è il modo genericamente corretto per ottenere un tipo di ritorno di vuoto? – Robert

+0

@Robert vedere il mio aggiornamento – Bozho

+0

Se si desidera restituire null come vuoto, è necessario eseguire il cast in alcuni casi: (Void) null – for3st

0

Non esiste un tipo generico che dirà al compilatore che un metodo non restituisce nulla.

Credo che la convenzione è quello di utilizzare l'oggetto quando si eredita come un parametro di tipo

O

propagare il parametro di tipo e poi lasciare che gli utenti della vostra classe instantiate utilizzando oggetti e assegnare l'oggetto a una tipizzato variabile utilizzando un tipo-jolly ?:

interface B<E>{ E method(); } 

class A<T> implements B<T>{ 

    public T method(){ 
     // do something 
     return null; 
    } 
} 

A<?> a = new A<Object>(); 
+1

è questa la convenzione per impostare il tipo di ritorno a void con generici - non sembra molto nullo per me? – Robert

+0

Credo che questa sia la strada da percorrere. Qualsiasi utente di classe 'A ' non sarà in grado di utilizzare il valore restituito di 'method()'. –

2

Se proprio non si ha bisogno di qualcosa come tipo, è possibile utilizzare vuoto. Questo può essere usato per implementare funzioni o azioni. È quindi possibile fare qualcosa del genere:

interface Action<T> { 
    public T execute(); 
} 

abstract class VoidAction implements Action<Void> { 
    public Void execute() { 
     executeInternal(); 
     return null; 
    } 

    abstract void executeInternal(); 
} 

Oppure si potrebbe omettere la classe astratta, e fare il return null in ogni azione che non richiede un valore di ritorno da soli.

È quindi possibile utilizzare queste azioni come questa:

dato un metodo di

private static <T> T executeAction(Action<T> action) { 
    return action.execute(); 
} 

si può chiamare come

String result = executeAction(new Action<String>() { 
    @Override 
    public String execute() { 
     //code here 
     return "Return me!"; 
    } 
}); 

o, per l'azione vuoto (si noti che è' non assegnando il risultato a nulla)

executeAction(new VoidAction() { 
    @Override 
    public void executeInternal() { 
     //code here 
    } 
}); 
+2

come è diverso da quello che ho già? restituisce ancora null, come ho suggerito – Robert

+0

Perché dovresti restituire qualcos'altro? Il punto che sto cercando di fare è che non hai bisogno del valore di ritorno, quindi non importa cosa ritorni. Ho provato a chiarirlo con la mia modifica. – Jorn

8

Java 8 ha introdotto una nuova classe, Optional<T>, che può essere utilizzata in questi casi.Per usarlo, devi modificare il codice di un po 'come segue:

interface B<E>{ Optional<E> method(); } 

class A implements B<Void>{ 

    public Optional<Void> method(){ 
     // do something 
     return Optional.empty(); 
    } 
} 

questo modo è possibile garantire che si sempre ottiene un valore di ritorno non nullo dal tuo metodo, anche quando non c'è nulla di ritorno. Ciò è particolarmente potente se utilizzato insieme a strumenti che rilevano quando null può o non può essere restituito, ad es. le annotazioni di Eclipse @NonNull e @Nullable.

+1

La mia opinione è che questo sta andando nella direzione sbagliata. È meglio restituire un tipo molto più vincolato che conferisca un significato molto più chiaro. Avere qualcosa che restituisce un 'Opzionale ' non è necessario per la stessa ragione per cui lo si presta, si ottiene sempre un 'Opzionale ' che è vuoto e quindi tutti gli altri metodi sono inutili. Questo è l'opposto del perché dovrebbe essere usato un valore opzionale. Lo usi perché potrebbe avere o meno un valore. Anche il compilatore non può imporre che 'method()' lo implementa correttamente. Questo fallirebbe in fase di esecuzione: 'return Optional.of (null)'. – Steiny

Problemi correlati