Dans mon code, je crée une collection d'objets à laquelle les différents threads auront accès d'une manière qui n'est sûre que si les objets sont immuables. Lorsqu'on tente d'insérer un nouvel objet dans ma collection, je veux vérifier s'il est immuable (sinon, je lève une exception).
Une chose que je peux faire est de vérifier quelques types immuables bien connus :
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());
}
Cela me permet de faire 90 % du chemin, mais il arrive que mes utilisateurs veuillent créer eux-mêmes des types immuables simples :
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; }
}
Existe-t-il un moyen (peut-être en utilisant la réflexion) de détecter de manière fiable si une classe est immuable ? Les faux positifs (penser qu'elle est immuable alors qu'elle ne l'est pas) ne sont pas acceptables, mais les faux négatifs (penser qu'elle est mutable alors qu'elle ne l'est pas) le sont.
Modifié pour ajouter : Merci pour ces réponses perspicaces et utiles. Comme certaines des réponses l'ont souligné, j'ai négligé de définir mes objectifs de sécurité. La menace ici est celle des développeurs ignorants - il s'agit d'un morceau de code de framework qui sera utilisé par un grand nombre de personnes qui ne connaissent pratiquement rien au threading et ne liront pas la documentation. Je n'ai PAS besoin de me défendre contre les développeurs malveillants -- toute personne suffisamment intelligente pour muter une chaîne de caractères ou faire d'autres manigances seront aussi assez intelligents pour savoir que ce n'est pas sûr dans ce cas. L'analyse statique de la base de code EST une option, tant qu'elle est automatisée, mais on ne peut pas compter sur les revues de code car il n'y a aucune garantie que les réviseurs de chaque revue soient sensibilisés au threading.