2013-10-12 2 views
0

나는 파라미터로 size 인 생성자를 가지고 있습니다. Eclipse는 Integer size을 final로 선언하도록 강요합니다. 왜 ?왜 일식이 내가 최종 결승전을 강요합니까?

public LRUCache(final Integer size) { 
     lhm = Collections.synchronizedMap(new LinkedHashMap<String, Integer>() { 
      @Override 
      public boolean removeEldestEntry(Map.Entry eldest) { 
       return size() > size; 
      } 
     }); 
    } 

답변

1

sizeInteger 개체에 대한 참조입니다. 당신이

size() > size 

을 할 때 당신은 그 int 값을 얻을 수 size를 역 참조한다. removeEldestEntry은 다른 상황에서 다른 시점에 발생하기 때문에 사용하는 참조가 선언하는 것과 동일하다는 보장이 필요합니다. 그러므로 final이 필요합니다. 그래서 참조는 바꿀 수 없다. the Java Language Specification

모든 지역 변수, 형식 매개 변수 또는 사용 예외 매개 변수지만 내부 클래스에서 선언하지 에서

최종 선언해야합니다.

and

(§14.4) 모든 빈 최종 필드 (§4.12.4, 는 §8.3.1.2)는 확실히 할당 된 값이 있어야합니다 각각의 지역 변수 때 그 값의 액세스 발생합니다.

V

and은 확실히 익명 클래스 선언하기 전에 할당 (§15.9.5) V의 IFF의 V의 범위 내에서 선언되었는지 확실히 클래스 인스턴스 생성 발현 후 할당 하다 익명의 클래스 인 을 선언합니다.

+0

죄송 합니다만, 귀하의 추천은 맞지만 설명은 꺼져 있습니다. 익명의 클래스에 대한 언급없이 문제의 전체 요점 인 로컬 변수의 사본을 만들어야합니다. 이 대답이 왜 받아 들여 졌는지 나는 잘 모르겠습니다. –

+0

@HovercraftFullOfEels 그게 내가 의미하는 바입니다. 당신이 사용하는 참조가 당신이 선언 한 것과 동일하다는 보장이 필요합니다. –

3

Eclipse는 아무 것도 강제하지 않습니다. Java은 로컬 변수가 익명의 내부 클래스에서 사용되는 경우 최종으로 선언해야합니다. 이 클래스는 사용 된 지역 변수의 복사본을 만들고, 변수가 final이 아닌 경우 원본과 복사본이 다른 값을 참조 할 수 있습니다.

+0

Nit :이 현상이 발생하는 일반적인 요구 사항은 아닙니다 ("다른 값을 나타낼 수도 있습니다"). Java 사양에 정의되어 있습니다. 클로저가있는 많은 언어가 바인딩 바인딩을 수정할 수 있습니다. 내부 클래스가 아닌 것은 "가난한 사람의 대용품"이며이 제한 사항 중 하나입니다. – user2864740

+0

@ user2864740 : 현재 Java 요구 사항 *이며 올바른 것으로, 이것이 Java 정의 방법입니다. 이것은 Java 8에서 변경 될 수 있습니다. –

+0

Java 요구 사항이 아니라는 것을 의미하지는 않습니다. 나는 초기 코멘트에서 언어를 고쳐 썼다. – user2864740

관련 문제