2012-08-09 4 views
2

익명 내부 클래스를 메서드 내에서 사용할 때 익명 내부 클래스 내부에서 메서드 매개 변수를 사용하려면이를 final로 표시해야합니다. 여기에 세부 정보가 나와 있습니다. Why do we use final keyword with anonymous inner classes?다른 인스턴스 속성을 사용하는 인스턴스 속성에 대한 익명 innerclass 선언

하지만 클래스 속성과 메소드 로컬 속성을 사용하면 어떻게됩니까?

간단한 유스 케이스 : 구아바 기능을 가진 봄 서비스 :

protected LovValueDAO lovValueDAO; 

private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() { 
    @Override 
    public LovValue apply(String input) { 
     return lovValueDAO.findById(input); 
    } 
}; 

@Required 
public void setLovValueDAO(LovValueDAO lovValueDAO) { 
    this.lovValueDAO = lovValueDAO; 
} 

는 그런 구아바 함수를 선언하는 안전한가요? 내 테스트에 따르면 잘 작동하지만 후드에서는 어떻게됩니까?

초기화 순서는 다음

  • 기능 초기화
  • lovValueDAO는

따라서 기능이 먼저 초기화 즉 같이 내가 추측 세터 통해 스프링 주입

  • lovValueDAO 함수 내에서 사용되는 속성은 DAO가 실제로 주입되면 참조가 복사되지만 참조 자체는 복사되지 않습니다.

    맞습니까?


    그리고 내가이 코드를 사용하는 경우 어떤 일이 : 난 함수를 호출 한 후

    private final Function<String,LovValue> LOV_ID_TO_LOV = new Function<String,LovValue>() { 
        @Override 
        public LovValue apply(String input) { 
         return lovValueDAO = null; 
        } 
    }; 
    

    가 내 외부 속성이 null로 설정 protected LovValueDAO lovValueDAO; 것인가를? 선언하는 클래스 필드에 대한 액세스는 정상적인 필드로 처리되도록

  • 답변

    4

    내부 클래스 (즉, 그것이 생성 된 컨텍스트에서의 선언 클래스의 인스턴스)의 둘러싸 인스턴스this에 내재 참조를 보유 그 참조에 의한 접근.

    따라서 내부 클래스는 필드의 현재 값을보고 변경 될 수 있습니다.

    관련 문제