Utilクラスなどstatic関数や定数のみのクラスを作成する時に、インスタンス化できないようにしたい場合があります。
結論
プライベートコンストラクタを作成して、throwを追加します。
class MyUtils {
MyUtils._() {
throw new AssertionError("private Constructor");
} // private constructor
}
解説
プライベートコンストラクタ
Dartでは、アンダースコア「_」を先頭につけると、Javaでいうところのアクセス演算子のprivateのように、外部のファイルやクラスからアクセスできなくなります。
今回は、名前付きコンストラクタで、最小構成のアンダースコアのみの名称にしています。引数もないため「MyUtils._()」という宣言になっています。
プライベートコンストラクターは、bodyがないときは、「MyUtils._privateConstructor();」のように「{}」がなくてもかまいません。
コンストラクタ内のthrow
コンストラクタ内でthrowしている理由は、同一ファイル内である場合、実行が可能になります。以下のコードを実行することが可能です。
main(List<String> args) {
MyUtils myUtils = MyUtils._();
}
class MyUtils {
MyUtils._() {
} // private constructor
}
そのため、どうしても使われたくない方は、「throw new AssertionError(“private Constructor”);」を追加します。throwするクラスに関しては、「UnsupportedError」でもいいかもしれません。
参考文献
Dart - Prevent Instantiation of Class
How to prevent instantiation of a class in Dart
コメント