2017-11-23 2 views
0

저는 init 블록을 사용하여 생성자에 값을 할당 한 경우에도 내 표준 변수의 값이 기본 값으로 대체되는 상황을 최근에 보았습니다. 내가 뭘하려Kotlin의 클래스에서 init 블록 위치

이었다

class Example(function: Example.() -> Unit) { 

    init { 
     function() 
    } 

    var name = "default name" 

} 


// assigning it like this: 
val example = Example { name = "new name" } 

// print value 
print(example.name) // prints "default name" 

조금 어려움을 겪고 후, 나는 발견했다 그 초기화 블록 문제의 위치. 클래스의 마지막에 init 블록을두면, 먼저 기본값을 사용하여 이름을 초기화 한 다음 값을 "새 이름"으로 바꾸는 function()을 호출합니다.

그리고 먼저 입력하면 이름을 찾을 수 없으며 속성을 초기화 할 때 이름이 "기본 이름"으로 바뀝니다.

이것은 나에게 이상합니다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?

+1

클래스의 초기화가 위에서 아래입니다 올바른 방법입니다, 초기화 블록은 면제되지 않습니다. –

+0

이 연습은 단지 Kotlin 초기화를 이해하기위한 것입니까? 그렇지 않다면'class Example (val name : String = "default name")' – Mikezx6r

+0

으로이 작업을 수행 할 수 있습니다.이 작업은 내 라이브러리 (https://github.com/kirtan403/k4kotlin)에서 상단에 전체 기능이 중단되었습니다. – kirtan403

답변

2

이유는 코 틀린은 상하 접근 문서에서

(An in-depth look at Kotlin’s initializers) 이니셜 (속성 초기화 및 초기화 블록) 그들이 클래스에서 정의되는 순서로 실행된다 맨 뒤에있다 -to-bottom.

여러 보조 생성자를 정의 할 수 있지만 생성자가 명시 적으로 다른 클래스를 호출하지 않는 한 클래스 인스턴스를 만들 때 하나만 호출됩니다.

생성자는 생성자가 호출 될 때마다 평가되는 기본 인수 값을 가질 수도 있습니다. 속성 이니셜 라이저와 마찬가지로 함수 호출이나 임의 코드를 실행하는 다른 표현식이 될 수 있습니다.

초기화 프로그램은 클래스의 기본 생성자 시작 부분에서 위에서 아래로 실행됩니다.

class Example(function: Example.() -> Unit) { 
var name = "default name" 
init { 
    function() 
} 
} 
+0

하단에 init 블록을 두는 것이 대부분의 시간을 의미하는 것입니까? 특별한 요구 사항이없는 한 ... – kirtan403