В моем коде я создаю коллекцию объектов, к которым будут обращаться различные потоки таким образом, что это безопасно, если объекты неизменяемы. Когда предпринимается попытка вставить новый объект в мою коллекцию, я хочу проверить, не является ли он неизменным (если нет, я сделаю исключение).
Одна вещь, которую я могу сделать, - проверить несколько известных неизменяемых типов:
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; }
}
Есть ли какой-то способ (возможно, использование отражения), что я могу надежно определить, является ли класс неизменным? Ложные срабатывания (считая его неизменным, когда это не так) неприемлемы, но ложные негативы (считая его изменчивым, когда это не так).
Отредактировано для добавления: Спасибо за проницательные и полезные ответы. Как указывалось в некоторых ответах, я забыл определить свои цели в области безопасности. Угроза здесь - это невежественные разработчики - это часть кода фреймворка, которая будет использоваться большим количеством людей, которые знают о потоке ничего не знают и не будут читать документацию. Мне не нужно защищаться от вредоносных разработчиков - любой, достаточно умный, для мутировать строку или выполнять другие махинации, также будет достаточно умным, чтобы знать это не безопасным в этом случае. Статический анализ кодовой базы является опцией, если она автоматизирована, но обзоры кода не могут быть учтены, потому что нет никакой гарантии, что каждый обзор будет иметь перекликающиеся рецензенты.