Java 8: cosa fa un ritorno vuoto in un costruttore?

1

Questo programma funziona correttamente. Qual è l'uso del ritorno vuoto nel costruttore, come sappiamo, restituirlo implicitamente. È un bug in java o ha qualche utilità.

class Demo
{
    int salary;

    Demo()
    {
        salary =11500;
        //return this;(implicitly)
        return;
    }
    public static void main(String... s)
    {
        System.out.println(new Demo().salary);
    }
}   
    
posta Kumar Rohit 08.09.2016 - 16:08
fonte

3 risposte

5

Il ritorno in una funzione di vuoto è usato per sfuggire al flusso di controllo prima della fine naturale di una funzione. In quanto tale, deve essere una dichiarazione valida.

Fare di tutto per impedirlo esplicitamente in quanto l'istruzione finale in una funzione non ha alcuno scopo se non quello di violare il codice esistente.

Potresti voler filtrare, ma non puoi renderlo un errore o mal formato.

    
risposta data 08.09.2016 - 16:15
fonte
2

Mettere un singolo ritorno alla fine del costruttore non cambia nulla ma non è dannoso e non è diverso dal mettere un ritorno alla fine di un metodo vuoto. Tuttavia, metti un ritorno in un altro punto del costruttore come in una condizione di guardia , molto fa una differenza. Poiché ciò è consentito, il valore di limitare l'uso del ritorno solo a quelle situazioni in cui non è ridondante non vale la pena. Complicerebbe la lingua senza una buona ragione.

    
risposta data 08.09.2016 - 19:08
fonte
0

Per il chiamante un costruttore si comporta come un metodo statico che restituisce un'istanza. Ma da dentro un costruttore si comporta come un void che restituisce il metodo istanza , quindi non essere in grado di specificare un valore sull'istruzione return è coerente.

Potresti modellarlo mentalmente come new XYZ() prima creando un'istanza inizializzata a zero nel codice generato dal compilatore e poi chiamando il costruttore scritto dall'utente su quell'istanza, proprio come un normale metodo di istanza.

Qualcosa come:

public static T create() // Compiler generated
{
    T instance = AllocateZeroed<T>();

    instance.field1 = ABC; // field initializers
    instance.field2 = DEF; // field initializers        
    ...

    instance.constructor(); // user-written constructor chain

    return instance;
}
    
risposta data 08.09.2016 - 16:33
fonte

Leggi altre domande sui tag