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