2010-05-16 6 views
1

커서를이 인스턴스에 대해 한 번 가져 오려면이 코드가 있어야하며 로그는 최종으로 표시되었지만 여러 번 호출되었음을 보여줍니다. 내가 누락 된 것?최종 수정자를 사용하여이 캐시가 작동하지 않는 이유

private Cursor getAllContactsCached() { 
     final Cursor c=this.getList(); 
     return c; 
    } 

getAllContactsCached 방법은 한 번 목록을 검색해야하고, 2 시간은 대가

답변

4

Java에 함수에 정적 로컬 변수가 없습니다 (예 : C와 같습니다). final은 자신이하는 것과 완전히 다른 것을 의미합니다. 정적의 종류를 얻을 수

유일한 방법은 인스턴스 또는 클래스 멤버, 예를 들어, 사용하는 것입니다

class Foo { 
    private Cursor theCursor; 

    private synchronized Cursor getAllContactsCached() { 
     if (this.theCursor == null) { 
      this.theCursor = this.getList(); 
     } 
     return this.theCursor; 
    } 
} 

(즉, 인스턴스 별 방법을, 당신은 또한이 작업을 수행 할 수 있습니다 클래스 전체 그런데, 그게 맞을 것 같아요. Cursor에 적합하지 않습니다.)

전체 메서드가 동기화되어 있습니다. 중요한 커서 인 경우에만이 중요합니다. 단순한 최적화이고 중요하지 않은 경우 경쟁 조건을 유지하면서 동기화하지 않아도됩니다.이 경우 함수에 의해 반환 된 두 개의 다른 커서로 끝날 수 있습니다. (당신은 double-checked locking idiom를 사용하는 유혹 수도 있지만 당신은 volatile 변수를 사용하지 않는 한 자바 작동하지 않으며, ends up just being better이 가서 동기화 할 수 있습니다.)

-1

아니의 최종 객체를 재사용해야한다. final은 변경하지 않기로 약속했음을 의미합니다. 변경하지 않으려면 정적 또는 클래스 멤버로 변경해야합니다.

+0

-1 - "최종 당신이 그것을 변경하지 않는 약속을 의미합니다 " - 잘못된. 그것은 당신이 그것을 바꿀 수 없다는 것을 의미합니다. 여기서 문제는 OP가 'c'의 범위/수명을 이해하지 못한다는 것입니다. –

관련 문제