[言語仕様]拡張メソッド(Extension Methods)で既存のクラスに機能を追加する

動作環境: Flutter 2.8.1 Dart 2.15.1
LINEでこのページを共有するTwitterでこのページを共有するこのページをはてなブックマークに追加

Dartでは既存のクラスに自分がほしいと思うメソッドを足し込んで機能拡張をすることができます。
例を見ていきましょう。

例) DateTimeクラスに日付の情報のみを取得するメソッドを追加する

DateTimeは日時を扱うためのクラスですが、時刻の情報は不要で日付だけほしいというケースには対応していません。
そこで、日付のみを取得できるようにdateOnlyというメソッド(厳密にいうと今回はゲッター)をDateTimeクラスに追加してみようと思います。

まずは以下のようにextensionを定義し、その中に自分が使いたいメソッドを書きます。

extension DateTimeExtension on DateTime {
  DateTime get dateOnly {
    return DateTime(year, month, day, 0, 0, 0);
  }
}

書き方としては最初の行でextension Extensionの名称 on 拡張したいクラス名 とします。
あとはその中にいつもと同じようにメソッドのコードを書くことができます。

3行目のようにyearmonthなど、元々DateTimeに備わっているメソッドを利用することができます。

あとはDateTimeが存在するところであればどこでも拡張メソッドのdateOnlyを呼び出すことができます。

print(DateTime.now().dateOnly); // 2022-03-03 00:00:00.000 を取得できる!

staticメソッドも追加できる?

staticメソッドも拡張メソッドとして追加できるのでしょうか?
たとえばDateTime.special_method()のようにメソッドを追加できるかというと、それはできないようです。

コード的には以下のように書いてもエラーにはならないようですが

extension DateTimeExtension on DateTime {
  static int special_method() {
    return 1;
  }
}

使用するときはDateTimeExtension.special_method()としなければ呼び出せないようです。
これだと、普通に自分でクラスを作ってstaticメソッドを作った方がよさそうです。

拡張メソッドは積極的に使い込む機能ではないかもしれませんが、プロジェクト内で高頻度かつ、どこでからも呼び出されるような処理や時刻や文字列などに汎用的に使える便利機能を準備したいケースでは拡張メソッドを使った方が便利になることはありそうですね。