メタデータアノテーションとは何か
@ から始まり、コードに静的な付加情報を付与します。コンパイラ・IDE・静的解析ツールが読み取り、実行ロジックに影響を与えません。
記述方法は2種類存在します:
- コンパイル時定義の組み込み定数:
@override、@deprecated - 定数コンストラクタの呼び出し:
@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)
Previous: Function
Next: Libraries ライブラリ