私のコードでは、オブジェクトが不変である場合にのみ安全な方法で、さまざまなスレッドによってアクセスされるオブジェクトのコレクションを作成しています。コレクションに新しいオブジェクトを挿入しようとしたときに、それが不変かどうかをテストしたいと思います (そうでない場合は、例外をスローします)。
私にできることの 1 つは、いくつかのよく知られた不変型を確認することです。
private static final Set<Class> knownImmutables = new HashSet<Class>(Arrays.asList(
String.class, Byte.class, Short.class, Integer.class, Long.class,
Float.class, Double.class, Boolean.class, BigInteger.class, BigDecimal.class
));
...
public static boolean isImmutable(Object o) {
return knownImmutables.contains(o.getClass());
}
これで実際には 90% の方法が得られますが、ユーザーが独自の単純な不変型を作成したい場合があります。
public class ImmutableRectangle {
private final int width;
private final int height;
public ImmutableRectangle(int width, int height) {
this.width = width;
this.height = height;
}
public int getWidth() { return width; }
public int getHeight() { return height; }
}
クラスが不変であるかどうかを確実に検出できる方法 (おそらくリフレクションを使用) はありますか? 偽陽性 (そうでないときに不変であると考える) は受け入れられませんが、偽陰性 (そうでないときに可変であると考える) は受け入れられます。
編集して追加:洞察に満ちた役立つ回答をありがとう。一部の回答が指摘しているように、私はセキュリティ目標を定義することを怠っていました。ここでの脅威は無知な開発者です。これは、スレッド化についてほとんど知らず、ドキュメントを読まない多数の人々によって使用されるフレームワーク コードの一部です。悪意のある開発者から防御する必要はありません。文字列を変更したり、他の悪ふざけを実行したりするのに十分賢い人は、この場合は安全ではないことを知るのに十分賢いでしょう。コードベースの静的分析は、自動化されている限りオプションですが、すべてのレビューにスレッドに精通したレビュー担当者がいるという保証はないため、コード レビューを当てにすることはできません。