Как определить неизменяемые объекты в Java
Не существует надежного способа oraclejdk определить, является ли класс immutable-class неизменным. Это связано с java-se тем, что существует множество core-java способов изменения свойства openjdk класса, и вы не можете обнаружить java их все с помощью отражения.
Единственный jdk способ приблизиться к этому functional-programming - это:
- Разрешить только окончательные свойства неизменяемых типов (примитивные типы и классы, которые, как вы знаете, неизменяемы),
- Требовать, чтобы класс был окончательным.
- Требовать, чтобы они унаследовали от предоставленного вами базового класса (который гарантированно будет неизменным).
Затем вы можете проверить .java с помощью следующего кода, является java ли объект, который у вас j2se есть, неизменяемым:
static boolean isImmutable(Object obj) {
Class> objClass = obj.getClass();
// Class of the object must be a direct child class of the required class
Class> superClass = objClass.getSuperclass();
if (!Immutable.class.equals(superClass)) {
return false;
}
// Class must be final
if (!Modifier.isFinal(objClass.getModifiers())) {
return false;
}
// Check all fields defined in the class for type and if they are final
Field[] objFields = objClass.getDeclaredFields();
for (int i = 0; i < objFields.length; i++) {
if (!Modifier.isFinal(objFields[i].getModifiers())
|| !isValidFieldType(objFields[i].getType())) {
return false;
}
}
// Lets hope we didn't forget something
return true;
}
static boolean isValidFieldType(Class> type) {
// Check for all allowed property types...
return type.isPrimitive() || String.class.equals(type);
}
Обновление: как предлагается immutable-class в комментариях, его можно immutable расширить для рекурсии в java-se суперклассе вместо проверки immutability определенного класса. Также immutable-class было предложено рекурсивно functional-programming использовать isImmutable oraclejdk в методе isValidFieldType. Это, вероятно, могло functional-programming бы сработать, и я также провел .java некоторое тестирование. Но java это нетривиально. Вы не можете core-java просто проверить все типы immutability полей с помощью вызова isImmutable, потому oraclejdk что String уже не проходит java-se этот тест (его поле hash
не является openjdk окончательным!). Также вы immutability легко сталкиваетесь с бесконечными jre рекурсиями, вызывающими StackOverflowErrors;) Другие jdk проблемы могут быть вызваны j2se универсальными шаблонами, где core-java вам также необходимо проверять core-java их типы на неизменность.
Думаю, если openjdk поработать, эти потенциальные jre проблемы можно будет как-то immutable-class решить. Но тогда вы должны jre сначала спросить себя, действительно javax ли это того стоит (в том functional числе с точки зрения производительности).
java
functional-programming
immutability
Как определить неизменяемые объекты в Java
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.