Для констант, которые могут принимать значение только из фиксированного набора значений, всегда лучше использовать перечисления Java вместо целых или строк или других необработанных типов данных.Их гораздо лучше понять и поддерживать в течение определенного периода времени.В идеале значения по умолчанию должны быть прочитаны из файла свойств для их инициализации.Но, как вы упомянули в вашем случае, вы хотите избежать затрат на чтение из файла по соображениям производительности.Вопрос дизайна всегда открыт и может иметь несколько подходов.Один из подходов, который я рекомендую, может быть следующим:
public interface Configuration {
public Continent getContinent(); //For fixed set of values use enum
public Integer getPoolSize(); //If the config can take any value then use the corresponding data type directly
public String getDefaultLabel();
}
public enum Continent {
ANTARTICA, AFRICA, ASIA, AUSTRALIA, EUROPE, NORTH_AMERICA, SOUTH_AMERICA;
}
public class ConfigurationBuilder {
private DefaultConfiguration configurationInstance;
private class DefaultConfiguration implements Configuration {
//Ideally the below values should be read from a property file, instead of hard coding it here.
private Integer poolSize = Integer.valueOf(50);
private String defaultLabel = "DEFAULT";
private Continent continent = Continent.ASIA;
@Override
public Continent getContinent() {
return continent;
}
@Override
public Integer getPoolSize() {
return poolSize;
}
@Override
public String getDefaultLabel() {
return defaultLabel;
}
}
public ConfigurationBuilder withContinent(Continent continent) {
this.configurationInstance.continent = continent;
return this;
}
public ConfigurationBuilder withPoolSize(Integer poolSize) {
this.configurationInstance.poolSize = poolSize;
return this;
}
public ConfigurationBuilder withDefaultLabel(String defaultLabel) {
this.configurationInstance.defaultLabel = defaultLabel;
return this;
}
public Configuration build() {
return this.configurationInstance;
}
public ConfigurationBuilder() {
this.configurationInstance = new DefaultConfiguration();
}
public static Configuration buildDefaultConfiguration() {
return new ConfigurationBuilder().build();
}
}
public class Library {
private Configuration configuration;
public void init(Configuration configuration) {
this.configuration = configuration;
}
public void init() {
this.configuration = ConfigurationBuilder.buildDefaultConfiguration();
}
private Library(Configuration config) {
this.init(config);
}
private Library() {
this.init();
}
/**
* Library is not singleton here.
*
*/
public static Library getInstance(Configuration configuration) {
return new Library(configuration);
}
public static Library getInstance() {
return new Library();
}
}
public class Client {
public static void main(String args[]) {
Configuration config = new ConfigurationBuilder()
.withContinent(Continent.AFRICA)
.withPoolSize(20)
.withDefaultLabel("Label")
.build();
Library lib = Library.getInstance();
lib.init(config);
}
}
Пожалуйста, проверьте классы Library и Client для использования.- Он использует шаблон Builder.- Он имеет методы init () и init (Configuration), чтобы полностью полагаться на значения по умолчанию библиотеки.- ConfigurationBuilder поддерживает предоставление некоторых или всех значений конфигурации для переопределения. - В настоящее время все три параметра конфигурации могут быть переопределены - continent, poolSize и defaultLabel.Однако, если какая-то конфигурация является частной для библиотеки, просто удалите метод withXXX для этого свойства из Builder.
Надеюсь, что это соответствует вашим потребностям.Хороший вопрос!