[kotlin] “lateinit”변수가 초기화되었는지 확인하는 방법?

lateinit변수가 초기화 되었는지 확인하는 방법이 있는지 궁금합니다 . 예를 들면 다음과 같습니다.

class Foo() {

    private lateinit var myFile: File

    fun bar(path: String?) {
        path?.let { myFile = File(it) }
    }

    fun bar2() {
        myFile.whateverMethod()
        // May crash since I don't know whether myFile has been initialized
    }
}



답변

lateinitKotlin 1.2에는 lateinit변수 의 초기화 상태를 직접 확인할 수 있는 개선 사항이 있습니다.

lateinit var file: File    

if (this::file.isInitialized) { ... }

JetBrains 블로그 또는 KEEP 제안 에있는 공지를 참조하십시오 .

업데이트 : Kotlin 1.2가 릴리스되었습니다. lateinit개선 사항은 여기에서 찾을 수 있습니다 .


답변

.isInitialized속성 1을 사용 하면 lateinit 변수의 초기화 상태를 확인할 수 있습니다.

if(::file.isInitialized){
    //File is initialized
}else{
    //File is not initialized
}


답변

그것을 사용하려고하면 UninitializedPropertyAccessException초기화되지 않은 경우 받게됩니다 .

lateinit특히 시공 후, 실제 사용 전 (대부분의 주입 프레임 워크가 사용하는 모델) 전에 필드가 초기화되는 경우를위한 것입니다. 이것이 사용 사례 lateinit가 아닌 경우 올바른 선택이 아닐 수 있습니다.

편집 : 당신이 이런 일을하고 싶은 것에 따라 더 잘 작동합니다 :

val chosenFile = SimpleObjectProperty<File?>
val button: Button

// Disables the button if chosenFile.get() is null
button.disableProperty.bind(chosenFile.isNull())


답변

다음을 통해 쉽게 수행 할 수 있습니다.

::variableName.isInitialized

또는

this::variableName.isInitialized

그러나 리스너 또는 내부 클래스에 있으면 다음을 수행하십시오.

this@YourClassName::variableName.isInitialized

참고 : 위의 문장은 변수가 선언 된 동일한 파일 (동일한 클래스 또는 내부 클래스)로 작성하면 잘 작동하지만 다른 클래스 (수퍼 클래스가 아니거나 선언 된 변수)를 확인하려는 경우 작동 하지 않습니다 다른 파일) 예 :

class Test {
    lateinit var str:String
}

그리고 str이 초기화되었는지 확인하려면 :

여기에 이미지 설명을 입력하십시오

우리는 필드에 접근 여기서 뭐하는거야 strTest에 클래스를 Test2클래스입니다. 그리고 우리는 var의 backing field에 액세스 할 수 없다는 오류가 발생합니다. 이미 제기 된 질문을 확인하십시오 .


답변

허용 된 대답 은에서 컴파일러 오류를 발생 시키므로 이전 Kotlin 1.3+this키워드 를 명시 적으로 언급 해야했습니다 ::. 아래는 작업 코드입니다.

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}


답변

a lateinit var가 초기화 되었는지 또는 .isInitialized해당 특성에 대한 참조를 사용하지 않는지 확인하려면 다음을 수행하십시오 .

if (foo::bar.isInitialized) {
    println(foo.bar)
}

이 검사는 사 전적으로 액세스 할 수있는 속성, 즉 동일한 유형 또는 외부 유형 중 하나 또는 동일한 파일에서 최상위 수준으로 선언 된 속성에만 사용할 수 있습니다.


답변

kotlin.UninitializedPropertyAccessException: lateinit property clientKeypair has not been initialized

바이트 코드는 말합니다 …

public final static synthetic access$getClientKeypair$p(Lcom/takharsh/ecdh/MainActivity;)Ljava/security/KeyPair;

`L0
LINENUMBER 11 L0
ALOAD 0
GETFIELD com/takharsh/ecdh/MainActivity.clientKeypair : Ljava/security/KeyPair;
DUP
IFNONNULL L1
LDC "clientKeypair"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.throwUninitializedPropertyAccessException (Ljava/lang/String;)V
    L1
ARETURN

L2 LOCALVARIABLE $이 Lcom / takharsh / ecdh / MainActivity; L0 L2 0 MAXSTACK = 2 MAXLOCALS = 1

Kotlin은 동일한 인스턴스의 추가 로컬 변수를 만들고 null인지 여부를 확인하고 null 인 경우 ‘throwUninitializedPropertyAccessException’을 throw하면 로컬 객체를 반환합니다. 위의 바이트 코드는 여기에 설명되어 있습니다.
솔루션 kotlin 1.2 이후 날씨를 확인할 수 있습니다..isInitialized