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


428

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
    }
}

3
어쩌면 필요한 것은 속성을 nullable로 변경하고 (유형을로 변경 File?) 대신 null인지 확인하는 것입니다.
Marcin Koziński 2016 년

1
글쎄, 나는 실제로 그것을 시도하고 그것은 트릭을 할 것입니다,하지만 allSeriesvar seriesDir?.listFiles()?.map { it.name }?.toTypedArray()" 를 편집해야합니다. "꽤 "가 아닙니다
Mathew Hany

1
평범한 오래된 null 확인을 수행 할 수 있으며 스마트 캐스트는 더 예쁘게 만듭니다. if (seriesDir != null) { allSeries = seriesDir.listFiles().map { it.name }.toTypedArray() }
Marcin Koziński 2016 년

보다 최신의 답변
misanthrope

답변:


977

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

lateinit var file: File    

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

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

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


3
@ fer.marino : Kotlin 1.2는 실제로 lateinit지역 변수에도 사용할 수 있습니다. kotlinlang.org/docs/reference/…
xsveda

9
this :: lateinitVar.isInitialized
vihkat

17
::이전의 의미는 무엇 file입니까?
Malwinder Singh

5
@MalwinderSingh 멤버 참조 또는 클래스 참조를 만듭니다.
notGeek

5
kotlin과 사랑에
Naveed Ahmad

46

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

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

이것은 질문에 대한 답변을 제공하지 않습니다. 저자에게 비평을하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. - 리뷰에서
gforce301

2
@ gforce301 검사에 명확하게 사용됩니다.
Nikhil Katekhaye

39

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

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

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

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

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

JavaFX 응용 프로그램이 있으며 변수 ( lateinit)가 초기화 되지 않은 경우 항상 비활성화되는 버튼이 있습니다 . 즉, 변수가 초기화되지 않은 한 버튼을 비활성화하고 싶습니다. 그렇게하는 좋은 방법이 있습니까?
Mathew Hany 2016 년

@MathewHany 정상적으로 초기화되는 방법은 무엇입니까? 버튼의 비활성화 된 속성에 바인딩 할 수있는 속성 getter / setters 및 SimpleBooleanProperty를 살펴볼 수 있습니다.
Kiskae

1
더 구체적으로 말하면 4 개의 버튼이 포함 된 간단한 응용 프로그램이 있으며 첫 번째 버튼은 DirectoryChooser 대화 상자를 열고 다른 3 개는 비활성화됩니다. 사용자가 디렉토리를 선택하면 다른 모든 버튼을 사용할 수 있습니다.
Mathew Hany

@MathewHany 기본적으로 SimpleObjectProperty를 사용하여 선택한 파일을 보유한 다음 isNull바인딩을 사용하여 다른 버튼을 비활성화하는 것을 기본적으로 구현할 수 있습니다 .
Kiskae 2016 년

1
kotlinlang.org/docs/reference/… xsveda 답변이 더 최신입니다
Serge

19

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

::variableName.isInitialized

또는

this::variableName.isInitialized

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

this@YourClassName::variableName.isInitialized

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

class Test {
    lateinit var str:String
}

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

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

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


12

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

lateinit var file: File

if (this::file.isInitialized) {

    // file is not null
}

내가 해결되지 않은 참조 같은 오류를 제공이 체크 사용할 때 로컬 초기화 변수를 사용하고 있습니다
마진

3

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

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

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


1
::이전의 의미는 무엇 bar입니까?
Malwinder Singh

@ Malwinder Singh "회원 참조 또는 클래스 참조를 만듭니다"
-Kotlin

0
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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.