アノテーションとは
- ソースコードの注釈
- コンパイラやJVMに付加情報を伝える
- 目印のようなもの
主なアノテーション
-
@Override→スーパークラスのメソッドをオーバーライド
-
@FunctionalInterface→関数型インターフェイス
→単一の抽象メソッドを持つインターフェイス(1つだけ持てる)
→staticメソッド、デフォルトメソッドは複数可
→Objectクラスのpublicメソッドである抽象メソッドは含まない(複数定義可)
package cp2.no3;
@FunctionalInterface
public interface FunctionalInter<T> {
// 単一の抽象メソッド(抽象メソッドは1つしか定義できない。2個以上は不可)
void foo(T t);
// Objectクラスのpublicメソッド
String toString();
// Objectクラスのpublicメソッド
boolean equals(Object object);
// staticメソッド
static void X() {};
// defaultメソッド
default void Y() {};
}
- @Deprecated→非奨励の要素
→プログラマが使用することを推奨されていないプログラム要素
→(例)コンストラクターDate(String)は非奨励
→DateFormatクラスのparse()メソッドの使用が推奨
→since, forRemovalという要素がある
→since…非奨励になったバージョンを示す
→forRemoval→将来のバージョンで注釈付きプログラム要素を削除する意志を示す
package cp2.no6;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
@Deprecated public static void main(String[] args) throws ParseException {
// 非奨励コード
Date date = new Date("2021/8/3");
System.out.println(date);
// 奨励コード
DateFormat df = new SimpleDateFormat("yyyy/MM/dd");
Date date2 = df.parse("2021/8/3");
System.out.println(date2);
}
}
- @SuppressWarnings→コンパイラの警告を無効化
→引数に抑制したい警告を指定することで、コンパイル時に表示される警告を抑制できる。
→rawtypes…ListではなくListの使用など、型の使用に関連する警告を抑制
(古いJava環境下でメンテナンスする際に、警告を抑制するなど)
→deprecation…@Deprecatedアノテーションがつけられたものに関する警告を抑制
package cp2.no7;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Main {
public static void main(String[] args) {
// @Deprecatedによる警告
@SuppressWarnings("deprecation")
Date date = new Date("2021/8/3");
// 型指定をしていない
@SuppressWarnings("rawtypes")
List list = new ArrayList();
}
}
- @SafeVarargs→安全でない可変長引数に対する警告を無効化
→実行時にClassCastExceptionが発生する可能性があるコードなど
→final, static, privateのいずれかのメソッドに限定
package cp2.no8;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
m(new ArrayList<String>());
}
@SafeVarargs
static void m(List<String>...stringLists) {
Object[] array = stringLists;
List<Integer> tempList = Arrays.asList(1);
array[0] = tempList;
// [[1]]の要素であるint型の1をStringの文字列に格納しようとするので
// 実行するとClassCastExceptionが発生
String s = stringLists[0].get(0);
}
}
今後の課題
- カスタムアノテーションについても学習していく必要があると感じる。