🐕

「class._()」でprivate constructorを定義する

2021/12/07に公開

flutter_native_splashExampleを読み、_() が不可解なため調べました。

不可解な部分
class Init {
  Init._();
  static final instance = Init._();

  Future initialize() async {
    await Future.delayed(const Duration(seconds: 3));
  }
}

結論

  • Init._()private constructor

解説

Dartにアクセス修飾子(public/protected/private)はありません。そのため、他言語のようにデフォルトコンストラクタにprivate修飾子を施す処理は実装できないため、_ (通称private & 名前必須だけど、処理に関係ない)を名前付きコンストラクタの名前にしている。

private constructorとは?

1度だけインスタンスされる特殊なコンストラクタです。
インスタンスを多量に生成するとパフォーマンス低下の原因につながるため、明示的にインスタンス化できないことを表すこでパフォーマンスや可読性、保守性を担保できる。
(コンストラクタを宣言していない場合、暗黙的にスーパークラスの引数がない状態のコンストラクタが実行される)

参考文献

Dartでインスタンス化を防ぐ方法
https://www.woolha.com/tutorials/dart-prevent-instantiation-of-class
Dartの言語仕様
https://dart.dev/guides/language/language-tour
多量のインスタンスがパフォーマンス低下につながる根拠
https://qiita.com/mistletoe/items/b52f499d6eb0ee836946

Discussion