Я использую около 1000 свойств, связанных с конкретным java.util.Properties, который поддерживается файлом. Основная причина для файла заключается в том, чтобы изменить их без перекомпиляции программы и позволить пользователям настроить их в соответствии со своими вкусами.
Некоторые свойства используются только в одном месте кода, но некоторые свойства используются несколько раз в разных сегментах кода и даже в разных классах.
У меня недавно появилась привычка объявлять все те свойства, которые используются в качестве строковых констант, обычно в отдельном интерфейсе, например:
public interface AnimalConstants {
public static final String WEIGHT_PROPERTY = "weight";
public static final String RUNNING_SPEED_PROPERTY = "speedInKph";
public static final String HOURS_OF_SLEEP_A_DAY_PROPERTY = "sleepHrs";
...
}
Когда классу требуется доступ к некоторым свойствам животных, я просто реализую этот интерфейс, и у меня есть доступ ко всем объявленным константам свойств. Когда мне нужно определенное свойство, я просто использую соответствующую константу, не задумываясь о том, каково ее точное имя (поскольку часто используются сокращения), и, что более важно, таким образом устраняется риск неправильного ввода имени свойства. Другое преимущество состоит в том, что если я позже решу переименовать свойство, чтобы сделать его более понятным для опытного пользователя, который настраивает эти свойства), мне просто нужно изменить это имя в интерфейсе, где объявлена эта константа свойства (и, конечно, файл свойств ), поэтому не нужно «искать и заменять» весь проект. Наконец, я могу легко проверить, используется ли свойство или нет; Я просто комментирую это, компилирую код и вижу, есть ли ошибка.
Однако, несмотря на все эти преимущества, мне любопытно, каковы недостатки этого подхода. Больше всего меня интересует следующее:
- Какое влияние оказывает этот подход (1000 строковых констант) на пул строк? Или они создаются по требованию, когда я получаю доступ к этим константам? Это предотвращает кэширование других строк в пуле строк?
- Какова стоимость производительности этого подхода по сравнению с той, в которой я использую жестко закодированные строковые константы, она одинакова (без учета стоимости доступа к полю)? Пул строк ведет себя одинаково или сильно отличается?
- Какое среднее увеличение памяти при таком подходе, все ли строковые константы хранятся в памяти все время?
Любой хороший комментарий / наблюдение приветствуется.