Index
ざっくり説明すると、変数の初期化のタイミングを遅らせるための修飾子です。
lateの基本的な使い方は以下の通り。
1 2 3 4 5 6 7 8 |
class Coffee { late String _temperature; void heat() { _temperature = 'hot'; } void chill() { _temperature = 'iced'; } String serve() => _temperature + ' coffee'; } |
この例ではString型の_temperature変数の初期化をheat(),chill()メソッドが呼ばれるまで延期しています。
以下のような書き方ではダメなのか疑問に思う方もいるかもしれません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// Using null safety, incorrectly: class Coffee { String _temperature; void heat() { _temperature = 'hot'; } void chill() { _temperature = 'iced'; } String serve() => _temperature + ' coffee'; } main() { var coffee = Coffee(); coffee.heat(); coffee.serve(); } |
実際にコードを書いてみると以下のようなエラーが出てしまいます。
エラーの内容をざっくり説明すると、「String型はNon-Nullable(nullが入ってはいけない)なので、初期化してちゃんと値を入れてください」という内容になってます。
では次のコードではダメなのか?
1 2 3 4 5 6 7 8 9 |
// Using null safety: class Coffee { String? _temperature; void heat() { _temperature = 'hot'; } void chill() { _temperature = 'iced'; } String serve() => _temperature! + ' coffee'; } |
_temparatureをnull代入可能にしてみました。
問題はないですが、このクラスのメンテナンスをする人が、nullになんか意味があるのでは?と考えてしまう可能性があります。(実際にはnullに意味はありません)
ここで使いたくなるのがlate修飾子になるわけです。
1 2 3 4 |
// Using null safety: class Weather { late int _temperature = _readThermometer(); } |
何が嬉しいの?と思う方もいるかもしれませんが、これはすべての初期化終了後にreadTermometer()を使って値を取得できることが嬉しいです。
つまり、クラス内の値を使用して、変数を初期化したい場合に使えるということです。
finalと一緒に使うことで値の代入が一度しか行えなくなります。
1 2 3 4 5 6 7 8 9 |
// Using null safety: class Coffee { late final String _temperature; void heat() { _temperature = 'hot'; } void chill() { _temperature = 'iced'; } String serve() => _temperature + ' coffee'; } |
https://dart.dev/null-safety/understanding-null-safety#late-variables