【Dart】Utilクラスのインスタンス化を防ぐ方法

dart Dart
Dart
この記事は約2分で読めます。

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

コメント