2016-08-05 2 views
3

나는 현재 내 응용 프로그램에서 영역을 사용하고, 나는 제대로 영역 인스턴스를 관리 확인, 내가 내 기본 활동에서이 같은 변수를 도입 코 틀린 :게으른 사용

protected val realm: Realm by lazy { 
     Realm.getDefaultInstance() 
} 

을 그리고들의 OnDestroy에서 내가 할 이 :

override fun onDestroy() { 
    super.onDestroy() 
    realm.close() 
} 

그리고 나서 나는 이것이 낭비임을 깨달았다. 현재 활동이 영역을 사용하지 않으면 열리고 즉시 onDestroy에 닫힙니다.

그래서 나는이 업데이트 :

private var usedRealm = false 

    protected val realm: Realm by lazy { 
     usedRealm = true 
     Realm.getDefaultInstance() 
    } 

override fun onDestroy() { 
     super.onDestroy() 

     if (usedRealm) { 
      realm.close() 
     } 
    } 

같은 작업을 수행 할 수있는 방법은 여분의 플래그를 사용하지 않고 있나요?

답변

10
  1. 현재 구현에 버그가 있습니다. Realm.getDefaultInstance()이 throw되면 usedRealm으로 설정되지만 지연은 실제로 초기화되지 않습니다 (초기화되지 않음). 당신은 Realm.getDefaultInstance() 호출 후 usedRealm = true를 호출하여이 문제를 해결할 수 있습니다

    protected val realm: Realm by lazy { 
        val realm = Realm.getDefaultInstance() 
        usedRealm = true 
        realm 
    } 
    

    또는

    protected val realm: Realm by lazy { 
        Realm.getDefaultInstance().apply { usedRealm = true } 
    } 
    
  2. 당신은 원시 Lazy 개체 자체에 대한 참조를 유지하여 여분의 플래그를 사용하지 않고 동일한 작업을 수행 할 수
  3. :

    private val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    protected val realm by lazyRealm 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        if (lazyRealm.isInitialized()) { 
         realm.close() 
        } 
    } 
    

    여전히 addit이 필요합니다. ional 필드를 사용하지만 더 이상 초기화 상태를 스스로 유지할 필요가 없습니다.

  4. 또한 Lazy 대신 직접 as a delegate를 사용할 수 있습니다

    protected val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        if (lazyRealm.isInitialized()) { 
         lazyRealm.value.close() 
        } 
    } 
    

    또는

    protected val lazyRealm = lazy { Realm.getDefaultInstance() } 
    
    override fun onDestroy() { 
        super.onDestroy() 
    
        with(lazyRealm) { 
         if (isInitialized()) { 
          value.close() 
         } 
        } 
    } 
    

    이 그것을 만드는 데에는 추가 특성 없지만 Lazy 지금 모든 곳에서 당신의 API의 일부가되도록 여기서 간단히 realm을 참조하면 lazyRealm.value을 참조해야합니다. 찬반 양론의 무게를 재십시오. :-)

+3

멋진 캐치! 감사 –

관련 문제