Как определить неизменяемые объекты в 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

2022-09-24T18:16:31+00:00