2012-02-01 8 views
7

Sono uno studente in classe Java e ho imparato qualcosa su Java oggi che ha fatto girare i miei ingranaggi. Quando ho chiesto all'insegnante come e perché, non era sicuro del comportamento. Qualcuno può spiegare perché il seguente esempio funziona?Ambito Java: Restituzione di un oggetto istanziato all'interno di un metodo - È pericoloso?

class Example { 
    public int ex_val; 

    public Example (int a) { 
     this.ex_val = a; 
    } 

    public int getExVal() { 
     return this.ex_val; 
    } 
} 

Se dovessi creare un'istanza di "Esempio" all'interno di un metodo di un'altra classe e "ritorno" l'oggetto, si può fare il salto con successo fuori di esso è portata originale e possono essere usate in seguito.

class ParentObject { 
    // Instance Variables  
    public Example a; 

    public ParentObject (int number) { 
     // Initialize instance variable object from out-of-scope instantiation 
     this.a = genExample(number); 

     // Verify scope creep 
     System.out.println(this.a.getExVal()); 
    } 

    public Example genExample (int a) { 
     return new Example(a); 
    } 
} 

Questo funziona, ma questo comportamento è stabile? Posso contare su questo? Il garbage collector può saltare tra l'istruzione return di un metodo e l'istruzione di assegnazione della funzione chiamante? Sto correndo il rischio di fallimento in base alla versione del mio sistema operativo della JVM? Sembra una funzionalità a portata di mano se può essere invocata.

+0

Non posso dire di aver capito cosa stai chiedendo qui. Cosa intendi per "saltare fuori dal suo ambito originale"? Sei un programmatore C++? –

+2

Si sta confondendo l'ambito con le durate. Pensa allo scope come relativo alle variabili, lifetime agli oggetti. –

risposta

9

Questa è una cosa assolutamente normale, comune e affidabile da fare in Java, e la cosa da fare è affidarsi al fatto che il garbage collector pulirà l'oggetto non appena non ci sono riferimenti in tempo reale ad esso. Questo non dipende dal SO o dalla JVM: qualsiasi JVM andrà bene con questo.

3

Questo è perfettamente normale.

Il garbage collector non può raccoglierlo perché è ancora indicato dal campo a.

A differenza di C++, gli oggetti Java non sono mai collegati all'ambito che li ha creati.

+0

, "A differenza di C++, gli oggetti Java non sono mai collegati all'ambito che li ha creati." -> Non è corretto. Se un oggetto viene creato all'interno di un corpo di una funzione e un riferimento ad esso non è "trapelato" sotto forma di un argomento di ritorno o con qualche altro mezzo, allora la sua durata è collegata all'ambito in cui è stato creato cioè una volta quell'oggetto è fuori ambito, è idoneo per la garbage collection. Potrebbe essere necessario riformulare l'ultima riga. – eternaln00b

+0

@SiddharthaShankar: sebbene sia vero, l'oggetto non è esplicitamente _linked_ per l'ambito. Piuttosto, capita solo di avere la stessa vita. – SLaks

Problemi correlati