java-safevarargs
Java @SafeVarargsアノテーション
1. 概要
このクイックチュートリアルでは、_ @ SafeVarargs_ annotationを見ていきます。
2. _ @ SafeVarargs_アノテーション
Java 5は、可変引数の概念、または可変長のメソッドパラメーター、およびパラメーター化された型を導入しました。
これらを組み合わせると、問題が発生する可能性があります。
public static <T> T[] unsafe(T... elements) {
return elements; // unsafe! don't ever return a parameterized varargs array
}
public static <T> T[] broken(T seed) {
T[] plant = unsafe(seed, seed, seed); // broken! This will be an Object[] no matter what T is
return plant;
}
public static void plant() {
String[] plants = broken("seed"); // ClassCastException
}
これらの問題は、コンパイラが確認するのが難しいため、_unsafe:_の場合のように、2つが組み合わされるたびに警告が表示されます。
warning: [unchecked] Possible heap pollution from parameterized vararg type T
public static <T> T[] unsafe(T... elements) {
このメソッドは、_broken_の場合のように誤って使用された場合、*意図したタイプ_b_ *ではなく、_Object [] _配列をヒープに汚染します。
この警告をつぶすために、_ @ SafeVarargs_注釈を* finalまたはstaticメソッドおよびコンストラクター*に追加できます。
_ @ SafeVarargs_は、特定のコンパイラ警告が誤検知であることを宣言できるという点で_ @ SupressWarnings_に似ています。 *アクションが安全であることを確認したら*、次の注釈を追加できます。
public class Machine<T> {
private List<T> versions = new ArrayList<>();
@SafeVarargs
public final void safe(T... toAdd) {
for (T version : toAdd) {
versions.add(version);
}
}
}
可変引数の安全な使用は、それ自体がトリッキーな概念です。 詳細については、Josh Blochの彼の本(https://books.google.com/books?id=BIpDDwAAQBAJ&pg=PT230&lpg=PT230&dq=example+of+unsafe+varargs&source=bl&ots=Lw9MgbL03e&sig=g9q2lQ0grFEHW2jRee&Wej&Wej&c=eR&f=eB&f=eB&c=eR&f=eB&hl=ja) X&ved = 0ahUKEwiCnLCsjqPZAhUW1WMKHQBnB14Q6AEIajAH#v = onepage&q = example%20of%20unsafe%20varargs&f = false [Effective Java]。
3. 結論
この簡単な記事では、Javaで_ @ SafeVarargs_ annotationを使用する方法を説明しました。
サンプルの完全なソースコードは、https://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-annotations [GitHub上]にあります。