Что означает сказать, что int enum patterns - это константы времени компиляции?
Это от эффективной Java
Программы, использующие шаблон int enum, являются хрупкими. Поскольку int перечисления константы времени компиляции, они компилируются в клиенты, которые их используют.
Может кто-нибудь объяснить, почему шаблон int enum называется скомпилированным типом константы и что подразумевается под , скомпилированным в клиентах?
Здесь s 'пример такой константы:
public static final int APPLE_FUJI = 0;
Ответы
Ответ 1
Предположим, у вас есть два файла:
Foo.java:
public class Foo
{
public static final int SOMETHING = 1;
}
Bar.java:
public class Bar
{
public static void main(String[] args)
{
System.out.println(Foo.SOMETHING);
}
}
Скомпилируйте их оба, запустите java Bar
и распечатайте 1.
Теперь измените Foo.java так, чтобы SOMETHING
равно 2, и перекомпилируйте только Foo.java. Rerun java Bar
и он все равно будет печатать 1. Постоянное значение будет скопировано на каждый фрагмент кода, который его использует, вместо того, чтобы запрашивать значение из Foo
во время выполнения.
На практике, если вы перекомпилируете все в любое время, что-либо изменится, это не проблема.
Ответ 2
Значение '0' будет встроено в файлы .class
во время компиляции. Если вы затем измените это значение, вам придется перекомпилировать все, что его использует, включая любой клиентский код, который использует ваше приложение/библиотеку.
Если вы этого не сделаете, вы не получите предупреждение, а скорее неправильное поведение.
Если ваша константа времени компиляции используется исключительно в вашем коде, это меньше проблем, предполагая полный цикл очистки/сборки. Если ваш код затем достигает более широкой аудитории, это становится проблемой.