In meinem Code erstelle ich eine Sammlung von Objekten, auf die verschiedene Threads auf eine Art und Weise zugreifen, die nur sicher ist, wenn die Objekte unveränderlich sind. Wenn versucht wird, ein neues Objekt in meine Sammlung einzufügen, möchte ich prüfen, ob es unveränderlich ist (wenn nicht, werde ich eine Ausnahme auslösen).
Eine Sache, die ich tun kann, ist, ein paar bekannte unveränderliche Typen zu überprüfen:
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());
}
Damit komme ich eigentlich zu 90 % weiter, aber manchmal wollen meine Benutzer selbst einfache unveränderliche Typen erstellen:
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; }
}
Gibt es eine Möglichkeit (vielleicht mit Reflexion), die ich zuverlässig erkennen könnte, ob eine Klasse unveränderlich ist? Falsch-positive Ergebnisse (denken, dass sie unveränderlich ist, obwohl sie es nicht ist) sind nicht akzeptabel, aber falsch-negative Ergebnisse (denken, dass sie veränderbar ist, obwohl sie es nicht ist) sind es.
Bearbeitet um hinzuzufügen: Vielen Dank für die aufschlussreichen und hilfreichen Antworten. Wie einige der Antworten zeigen, habe ich es versäumt, meine Sicherheitsziele zu definieren. Die Bedrohung besteht hier in ahnungslosen Entwicklern - dies ist ein Stück Framework-Code, das von einer großen Anzahl von Leuten verwendet wird, die so gut wie nichts über Threading wissen und die Dokumentation nicht lesen werden. Ich muss mich NICHT gegen böswillige Entwickler verteidigen - jeder, der clever genug ist, um einen String mutieren oder anderen Blödsinn anstellen, werden auch klug genug sein, um zu wissen, dass es in diesem Fall nicht sicher ist. Die statische Analyse der Codebasis IST eine Option, solange sie automatisiert ist, aber auf Code-Reviews kann man sich nicht verlassen, da es keine Garantie dafür gibt, dass bei jedem Review threading-kundige Reviewer anwesend sind.