🐕
「class._()」でprivate constructorを定義する
flutter_native_splashのExample
を読み、_() が不可解なため調べました。
不可解な部分
class Init {
Init._();
static final instance = Init._();
Future initialize() async {
await Future.delayed(const Duration(seconds: 3));
}
}
結論
-
Init._()
はprivate constructor 。 -
instance
変数は不要。むしろ実装してはいけない(と思う)。
解説
Dartにアクセス修飾子(public/protected/private)はありません。そのため、他言語のようにデフォルトコンストラクタにprivate
修飾子を施す処理は実装できないため、_ (通称private & 名前必須だけど、処理に関係ない)を名前付きコンストラクタ
の名前にしている。
private constructorとは?
1度だけインスタンスされる特殊なコンストラクタです。
インスタンスを多量に生成するとパフォーマンス低下の原因につながるため、明示的にインスタンス化できないことを表すこでパフォーマンスや可読性、保守性を担保できる。
(コンストラクタを宣言していない場合、暗黙的にスーパークラスの引数がない状態のコンストラクタが実行される)
instance変数が不要だと思う根拠
複数回インスタンスされる可能性を秘めている&「静的クラス」という概念を否定している。
静的変数は、使用されるまで初期化されません。つまり使用するたびに初期化するため、何度もコンストラクタを参照する恐れがあります。
また静的クラスの特徴に『メンバーは静的な内容しか含まない』があるため、本サンプルのinitialize()
は相反している。
参考文献
Dartでインスタンス化を防ぐ方法
Dartの言語仕様 多量のインスタンスがパフォーマンス低下につながる根拠
Discussion