2012-02-01 10 views
7

Soy un estudiante en la clase de Java y aprendí algo sobre Java hoy que hizo que mis engranajes giren. Cuando le pregunté al profesor cómo y por qué, no estaba seguro del comportamiento. ¿Alguien puede explicar por qué funciona el siguiente ejemplo?Alcance de Java: devolver un objeto instanciado dentro de un método: ¿es peligroso?

class Example { 
    public int ex_val; 

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

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

Si tuviera que crear una instancia de "Ejemplo" dentro de un método de otra clase y "retorno" del objeto, con éxito puede hacer el salto fuera de él es alcance original y ser utilizado posteriormente.

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); 
    } 
} 

Esto funciona, pero ¿es este comportamiento estable? ¿Puedo contar con esto? ¿Puede el recolector de basura saltar entre la declaración de devolución de un método y la instrucción de asignación de la función de llamada? ¿Estoy corriendo el riesgo de error en función de la versión de JVM de mi sistema operativo? Esto parece una funcionalidad práctica si se puede confiar en ella.

+0

No puedo decir que entiendo lo que estás preguntando aquí. ¿A qué te refieres con "saltar de su alcance original"? ¿Eres un programador de C++? –

+2

Estás confundiendo el alcance con los tiempos de vida. Piense en el alcance como perteneciente a variables, vida a objetos. –

Respuesta

9

Esto es algo totalmente normal, común y confiable que hacer en Java, y lo que hay que hacer es confiar en que el recolector de basura limpiará el objeto tan pronto como no haya referencias vivas al mismo. Esto no depende del sistema operativo o depende de JVM: cualquier JVM estará bien con esto.

3

Esto es perfectamente normal.

El recolector de basura no puede recogerlo porque todavía se lo menciona en el campo a.

A diferencia de C++, los objetos de Java nunca están vinculados al ámbito que los creó.

+0

, "A diferencia de C++, los objetos Java nunca están vinculados al alcance que los creó". -> Eso es incorrecto. Si un objeto se crea dentro de un cuerpo de función y una referencia a él no se "filtra" en forma de un argumento de retorno o por algún otro medio, entonces su duración está vinculada al ámbito en el que se creó, es decir, una vez que ese objeto está fuera de alcance, es elegible para la recolección de basura. Es posible que deba reformular la última línea. – eternaln00b

+0

@ SiddharthaShankar: aunque eso es cierto, el objeto no está explícitamente enlazado al alcance. Por el contrario, pasa a tener la misma vida. – SLaks

Cuestiones relacionadas