メタデータ アノテーション

メタデータアノテーションとは何か

@ から始まり、コードに静的な付加情報を付与します。コンパイラ・IDE・静的解析ツールが読み取り、実行ロジックに影響を与えません。

記述方法は2種類存在します:

  1. コンパイル時定義の組み込み定数:@override@deprecated
  2. 定数コンストラクタの呼び出し:@Deprecated("メッセージ")、自作アノテーション @Todo("xxx", "xxx")

クラス、メソッド、変数、関数、引数、インポート、列挙型などに使用されます。

@Deprecated

廃止されたAPIをマークします。代替手段と削除予定日を記載する必要があります。用途別に制限をかける静的メソッドも用意されています。

class Television {
  /// 代替:turnOn を使用
  @Deprecated('代わりに turnOn() を使用してください。このメソッドは2026年末に削除されます')
  void activate() {
    turnOn();
  }

  void turnOn() {
    print("テレビ起動");
  }
}

// 用途別廃止制限の例
@Deprecated.instantiate() // new によるクラスのインスタンス生成を禁止
class OldDevice {}

@Deprecated.extend() // 他クラスの継承を禁止
class Base {}

// Base を継承するとエディタに廃止警告が表示される
class Sub extends Base {}

void main() {
  Television tv = Television();
  // @Deprecated 付きメソッド呼び出し時、IDEに取り消し線と警告が表示
  tv.activate();
  // 推奨される新しいメソッド
  tv.turnOn();

  // OldDevice をインスタンス化すると @Deprecated.instantiate() の警告が発生
  OldDevice device = OldDevice();
}
Code language: Dart (dart)

上記コードは正常にコンパイル・実行できますが、IDEやコンパイラ上に警告が表示されます。Android Studio または IntelliJ IDEA で動作確認できます。

@deprecated

カスタムメッセージ無しの簡易廃止マーカー。@Deprecated("説明文") の使用を推奨します。

@deprecated
void oldFunc() {}
Code language: Dart (dart)

@override

親クラス / インターフェースの同名メンバーをオーバーライドした箇所に付記します。IDEが検証を行い、メソッド名のスペルミスがあると赤いエラーが出ます。

class Animal {
  void speak() {}
}

class Dog extends Animal {
  // @override:親クラスの speak メソッドをオーバーライド
  @override
  void speak() {
    print("ワンワン");
  }
}

class Cat extends Animal {
  @override
  void speak() {
    print("ニャー");
  }
}

class Pig extends Animal {
   // オーバーライドなし
}

void main() {
  Animal dog = Dog();
  Animal cat = Cat();
  Animal pig = Pig();

  dog.speak(); // 出力:ワンワン
  cat.speak(); // 出力:ニャー
  pig.speak();
}
Code language: Dart (dart)

@pragma

コンパイラ・静的解析ツールに低レベルな最適化や識別命令を渡すための記述。主に低層開発で使用されます。

// 例:コンパイラにこの関数をインライン展開するよう指示
@pragma('vm:prefer-inline')
int add(int a, int b) => a + b;
Code language: Dart (dart)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です