2012-02-01 2 views
7

저는 Java 클래스의 학생이며, 오늘날 Java에 대해 배웠습니다. 내가 어떻게 그리고 왜 교사에게 물었을 때 그는 그 행동에 대해 확신하지 못했습니다. 왜 다음 예제가 효과가 있는지 설명 할 수 있습니까?자바 스코프 : 메서드 내부에서 인스턴스화 된 객체 반환 - 위험한가?

class Example { 
    public int ex_val; 

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

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

내가 다른 클래스와 "반환"객체의 메서드 내 "예"의 인스턴스를 생성한다면, 그것은 성공적으로 밖으로 점프는 원래의 범위이고 연속적으로 사용 할 수 있습니다.

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

이것은 작동하지만이 동작은 안정적입니까? 이거 믿어도 될까요? 가비지 수집기가 한 메소드의 return 문과 호출하는 함수의 대입문 사이를 건너 뛸 수 있습니까? 내 OS 버전의 JVM을 기반으로 실패 위험을 감수하고 있습니까? 이것은 신뢰할 수있는 경우 편리한 기능처럼 보입니다.

+0

나는 당신이 여기서 묻고있는 것을 이해한다고 말할 수 없다. "원래의 범위에서 뛰어 내리다"는 것은 무엇을 의미합니까? 당신은 C++ 프로그래머입니까? –

+2

수명과 범위가 혼동을줍니다. 범위는 변수에, 수명은 객체에 해당한다고 생각하십시오. –

답변

9

이것은 Java에서 일반적으로 공통적으로 수행하는 신뢰할 수있는 작업이며 수행 할 작업은 가비지 수집기가 실제 참조가없는 즉시 객체를 정리한다는 신뢰입니다. 이것은 OS에 의존하지 않거나 JVM에 종속적 인 것이 아닙니다. 모든 JVM에서이 기능을 사용할 수 있습니다.

3

이것은 정상적인 현상입니다.

가비지 수집기는 여전히 a 필드에서 참조하기 때문에 수집 할 수 없습니다.

C++과 달리 Java 객체는 절대로 해당 객체를 만든 범위에 연결되지 않습니다.

+0

, "C++과 달리 Java 객체는 절대로 객체를 만든 범위에 연결되지 않습니다." -> 그건 틀렸어. 오브젝트가 함수 본문 내에서 작성되고 해당 오브젝트에 대한 참조가 리턴 인수 또는 다른 f}으로 "유출"되지 않으면 해당 오브젝트의 수명이 작성된 | 위와 링크됩니다 범위를 벗어났습니다. 가비지 수집 대상입니다. 마지막 줄을 다시 말해야 할 수도 있습니다. – eternaln00b

+0

@SiddharthaShankar : 사실이지만, 개체가 명시 적으로 _linked_ 범위에 없습니다. 오히려 같은 일이 생깁니다. – SLaks

관련 문제