Подтвердить что ты не робот

Что означает сказать, что int enum patterns - это константы времени компиляции?

Это от эффективной Java

Программы, использующие шаблон int enum, являются хрупкими. Поскольку int перечисления константы времени компиляции, они компилируются в клиенты, которые их используют.

Может кто-нибудь объяснить, почему шаблон int enum называется скомпилированным типом константы и что подразумевается под , скомпилированным в клиентах?

Здесь s 'пример такой константы:

public static final int APPLE_FUJI = 0;
4b9b3361

Ответ 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 во время компиляции. Если вы затем измените это значение, вам придется перекомпилировать все, что его использует, включая любой клиентский код, который использует ваше приложение/библиотеку.

Если вы этого не сделаете, вы не получите предупреждение, а скорее неправильное поведение.

Если ваша константа времени компиляции используется исключительно в вашем коде, это меньше проблем, предполагая полный цикл очистки/сборки. Если ваш код затем достигает более широкой аудитории, это становится проблемой.