Все константы времени компиляции встраиваются?

22
задан Chris Cudmore 18 December 2008 в 13:33
поделиться

6 ответов

Вы можете использовать String.intern (), чтобы получить желаемый эффект, но следует прокомментировать свой код, потому что не многие люди знают об этом. то есть

public static final String configOption1 = "some option".intern();

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

В качестве альтернативы вы всегда можете использовать

public static final String configOption1 = "some option".toString();

, однако при этом не будет использоваться скомпилированная внутренняя строка, она создаст новую на старом поколении. Ничего особенного, и, возможно, будет легче читать. В любом случае, поскольку это немного странно, вы должны прокомментировать код, чтобы проинформировать тех, кто его обслуживает, о том, что вы делаете.

Изменить: Обнаружена еще одна ссылка SO, которая дает ссылки на JLS, для получения дополнительной информации об этом. Когда использовать intern () для строковых литералов

27
ответ дан 29 November 2019 в 04:06
поделиться

Нет, это - часть JLS, я боюсь. Это затронуто, кратко, в Трудных вопросах Java, но у меня нет своей копии для вручения.

я предполагаю, что Вы могли бы рассмотреть определение этих констант в файле свойств и иметь класс, который периодически загружает их.

Ссылка: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313

10
ответ дан GaryF 29 November 2019 в 04:06
поделиться

Нет. Вы могли заменить их вызовом статического метода, тем не менее, как:

class ApplicationDefs {

    public static String configOption1() { return "some option"; }

}

Предоставленный, it’s не красивый, но это выполнило бы Ваше требование.:)

7
ответ дан Bombe 29 November 2019 в 04:06
поделиться

На самом деле, если Вы удаляете final ключевое слово , константы прекращают быть константами времени компиляции, и затем Ваша конфигурация будет работать как Вы, хотят.

Однако это настоятельно рекомендуется, который, если это - действительно своего рода конфигурация, Вы пытаетесь сделать, необходимо переместиться в к более управляемому пути, чем константы в некотором файле класса.

7
ответ дан Yuval Adam 29 November 2019 в 04:06
поделиться

Можно подавить встраивание путем создания постоянных констант невремени компиляции...

, Например, null не постоянное время компиляции. Любое выражение, включающее постоянное невремя компиляции, не является постоянным временем компиляции, хотя javac может сделать сворачивание констант в единице компиляции.

public static final String configOption1 = null!=null?"": "some option";
6
ответ дан Tom Hawtin - tackline 29 November 2019 в 04:06
поделиться

Нет ничего здесь, которое говорит, что эти значения должны быть встроены. Вы просто объявляете [приблизительно 110], static участники. Те другие классы используют значения этих участников. Никакое встраивание не спрашивают. Даже final ключевое слово

, Но для причины производительности , некоторый май JVMs встроенный эти значения в тех других классах. Это - оптимизация. Никакая оптимизация не должна изменять поведение программы. Таким образом, при изменении определения этих участников JVM должна невстроенный предыдущие значения.

Поэтому нет никакого способа выключить встраивание. Или JVM не встраивает и нет никакой проблемы или если она встраивается, гарантия JVM невстраивание.

я не уверен, что происходит, когда Вы импортируете статически этот класс. Я думаю (не уверенный), встраивание выполняется и может доставить неприятности, которые Вы упоминаете. Если это так, Вы могли в основном удалить статический импорт, и Вы в порядке.

-4
ответ дан Pierre 29 November 2019 в 04:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: