Вопрос

Допустим, у меня есть такой класс:

class ApplicationDefs{
public static final String configOption1 = "some option";
public static final String configOption2 = "some other option";
public static final String configOption3 = "yet another option";
}

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

Есть ли возможность отключить встроенные константы времени компиляции?

Это было полезно?

Решение

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

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

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

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

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

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

Редактировать:Нашел еще одну ссылку, которая дает ссылки на 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"; }

}

Конечно, это не красиво, но это выполнит ваше требование. :)

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

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

Вы можете препятствовать внедрению, делая постоянные постоянные некомпиляции константы времени ...

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

public static final String configOption1 = null!=null?"": "some option";

Здесь нет ничего, что говорит о том, что эти ценности должны быть вставлены. Вы просто объявляете некоторые public, static члены Эти другие классы используют значения этих членов. Не просит внедрения. Даже final ключевое слово

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

Вот почему нет способа отключить Inline Off. Либо JVM не встроена, и нет проблем, либо если он вставлен, JVM гарантирует нелинейность.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top