〈kotlin〉文法メモ:lateinit

kotlinでは全ての変数をあらかじめ初期化しておかなければならない。
変数を定義した段階でまだ値を用意できていないという場合は、
lateinitを使うことで初期化を遅らせることができる。

class LoginFragment : Fragment() {

    private lateinit var usernameEditText: EditText
    private lateinit var passwordEditText: EditText
    private lateinit var loginButton: Button
    private lateinit var statusTextView: TextView

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        usernameEditText = view.findViewById(R.id.username_edit_text)
        passwordEditText = view.findViewById(R.id.password_edit_text)
        loginButton = view.findViewById(R.id.login_button)
        statusTextView = view.findViewById(R.id.status_text_view)
    }

    ...
}

https://developer.android.com/kotlin/common-patterns?hl=jaより引用。
lateinitをつけて宣言した後、onViewCreate内で値を割り当てている。

もし、lateinitを使わずに変数を定義しておくなら、
型名に?をつけてnull許容型としnullを代入しておく方法もある。
ただしこの場合、変数を参照する全てのタイミングで(変数 != null)を書いてnullチェックする必要がある。

lateinitとしておけば、初期化をせず非null型の変数として定義しておける。
その変数を参照する前までに値を代入すれば良い。
もし初期化する前に参照してしまうと、UninitializedPropertyAccessExceptionが出るので注意。