Вы можете использовать String.intern (), чтобы получить желаемый эффект, но следует прокомментировать свой код, потому что не многие люди знают об этом. то есть
public static final String configOption1 = "some option".intern();
Это предотвратит встраивание времени компиляции. Поскольку это относится к той же самой строке, которую компилятор поместит в perm, вы не создаете ничего лишнего.
В качестве альтернативы вы всегда можете использовать
public static final String configOption1 = "some option".toString();
, однако при этом не будет использоваться скомпилированная внутренняя строка, она создаст новую на старом поколении. Ничего особенного, и, возможно, будет легче читать. В любом случае, поскольку это немного странно, вы должны прокомментировать код, чтобы проинформировать тех, кто его обслуживает, о том, что вы делаете.
Изменить: Обнаружена еще одна ссылка SO, которая дает ссылки на JLS, для получения дополнительной информации об этом. Когда использовать intern () для строковых литералов
Нет, это - часть JLS, я боюсь. Это затронуто, кратко, в Трудных вопросах Java, но у меня нет своей копии для вручения.
я предполагаю, что Вы могли бы рассмотреть определение этих констант в файле свойств и иметь класс, который периодически загружает их.
Ссылка: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#5313
Нет. Вы могли заменить их вызовом статического метода, тем не менее, как:
class ApplicationDefs {
public static String configOption1() { return "some option"; }
}
Предоставленный, it’s не красивый, но это выполнило бы Ваше требование.:)
На самом деле, если Вы удаляете final
ключевое слово , константы прекращают быть константами времени компиляции, и затем Ваша конфигурация будет работать как Вы, хотят.
Однако это настоятельно рекомендуется, который, если это - действительно своего рода конфигурация, Вы пытаетесь сделать, необходимо переместиться в к более управляемому пути, чем константы в некотором файле класса.
Можно подавить встраивание путем создания постоянных констант невремени компиляции...
, Например, null
не постоянное время компиляции. Любое выражение, включающее постоянное невремя компиляции, не является постоянным временем компиляции, хотя javac может сделать сворачивание констант в единице компиляции.
public static final String configOption1 = null!=null?"": "some option";
Нет ничего здесь, которое говорит, что эти значения должны быть встроены. Вы просто объявляете [приблизительно 110], static
участники. Те другие классы используют значения этих участников. Никакое встраивание не спрашивают. Даже final
ключевое слово
, Но для причины производительности , некоторый май JVMs встроенный эти значения в тех других классах. Это - оптимизация. Никакая оптимизация не должна изменять поведение программы. Таким образом, при изменении определения этих участников JVM должна невстроенный предыдущие значения.
Поэтому нет никакого способа выключить встраивание. Или JVM не встраивает и нет никакой проблемы или если она встраивается, гарантия JVM невстраивание.
я не уверен, что происходит, когда Вы импортируете статически этот класс. Я думаю (не уверенный), встраивание выполняется и может доставить неприятности, которые Вы упоминаете. Если это так, Вы могли в основном удалить статический импорт, и Вы в порядке.