java - 如何从硬编码的静态配置文件切换到 .properties 文件?

标签 java refactoring

我有一些代码使用了一个包含大量硬编码常量的类。这是它的样子:

class Constants{
    public static final String name1 = "value1";
    public static final String name2 = "value2";
    public static final Integer value3 = 3;
    ... and so on
}

这些常量在代码中无处不在,如 Constants.name1

我现在需要做的是使在配置文件中为这些常量指定值成为可能,可能是 *.properties 文件。

我的问题是:最好的方法是什么,必须尽可能少地重写代码?

我想过使用一个配置类,它在实例化时从文件中读取属性,但是我必须将所有静态值调用替换为对该类实例的调用,并且我必须更改现有方法将此配置实例传递给它们。有没有更好的办法?

最佳答案

这是我过去使用过的一段代码 - 可以根据您的示例进行调整:

public enum Configuration {

    PROPERTY1("property1.name", "default_value_1"),
    PROPERTY2("property2.name", "default_value_2");

    private final String key;
    private String defaultValue;

    Configuration(String key) {
        this(key, NA);
    }

    Configuration(String key, String defaultValue) {
        this.key = key;
        this.defaultValue = defaultValue;
    }
    private final static Logger logger = LoggerFactory.getLogger(Configuration.class);
    private final static String NA = "n.a.";
    private final static String CONFIG_FILE = "properties/config.properties";
    private final static String NOT_A_VALID_KEY = "Not a valid property key";
    private final static Map<Configuration, String> configuration = new EnumMap<>(Configuration.class);

    static {
        readConfigurationFrom(CONFIG_FILE);
    }

    private static void readConfigurationFrom(String fileName) {
        logger.info("Reading resource: {}", fileName);
        try (InputStream resource = Configuration.class.getClassLoader().getResourceAsStream(fileName);) {
            Properties properties = new Properties();
            properties.load(resource); //throws a NPE if resource not founds
            for (String key : properties.stringPropertyNames()) {
                configuration.put(getConfigurationKey(key), properties.getProperty(key));
            }
        } catch (IllegalArgumentException | IOException | NullPointerException e) {
            logger.error("Error while reading the properties file {}", fileName, e);
            populateDefaultValues();
        }
    }

    private static Configuration getConfigurationKey(String key) {
        for (Configuration c : values()) {
            if (c.key.equals(key)) {
                return c;
            }
        }
        throw new IllegalArgumentException(NOT_A_VALID_KEY + ": " + key);
    }

    private static void populateDefaultValues() {
        for (Configuration c : values()) {
            configuration.put(c, c.defaultValue);
        }
    }

    /**
     * @return the property corresponding to the key or null if not found
     */
    public String get() {
        return configuration.get(this);
    }
}

关于java - 如何从硬编码的静态配置文件切换到 .properties 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17809130/

相关文章:

python - PyCharm:无法移动Refactor静态方法

c++ - 我应该为永远恒定的值创建一个全局常量变量,例如足球运动员的数量吗?

java - 在屏幕上绘图,在shell外使用java swt?

java - 这是一个什么样的Java成员变量?

java - 从 URL 中提取部分字符串 - Java Regex

ruby-on-rails - 抽象异常检查

python - 如何减小 5 层 for 循环的大小

c++ - 将传递引用转换为传递返回

java - 如何在 .java 文件中导入 .class 文件?

java - Servlet 调度程序当前不可用