Что значит сказать, что шаблоны int enum являются константами времени компиляции?
Это из эффективной Java
Программы, использующие шаблон int enum, являются хрупкими. Поскольку перечисления int являются константами времени компиляции, они компилируются в клиенты, которые их используют.
Кто-нибудь может объяснить, почему шаблон int enum называется константой скомпилированного типа и что означает скомпилированный в клиентах?
Вот пример такой константы:
public static final int APPLE_FUJI = 0;
2 ответа
Предположим, у вас есть два файла:
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. повторный показ java Bar
и он по- прежнему будет печатать 1. Постоянное значение будет скопировано в каждый фрагмент кода, который его использует, вместо того, чтобы запрашивать значение из Foo
во время исполнения.
На практике, если вы перекомпилируете все, когда что-то меняется, это не проблема.
Само значение "0" будет встроено в .class
файлы во время компиляции. Если вы затем измените это значение, вам придется перекомпилировать все, что его использует, включая код любого клиента, который использует ваше приложение / библиотеку.
Если вы этого не сделаете, вы не получите предупреждение, а скорее неправильное поведение.
Если ваша константа времени компиляции используется исключительно в вашем коде, то это меньше проблем, предполагая полный цикл очистки / сборки. Если ваш код затем достигает более широкой аудитории, то это становится большей проблемой.