当前位置: 首页 > 面试题库 >

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

周鸿云
2023-03-14
问题内容

我有一些代码使用包含大量硬编码常量的类。看起来是这样的:

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);
    }
}


 类似资料:
  • 更新答案(2021年10月7日):对于AWS CLI v1,请执行以下操作: 对于AWS CLI v2,以下操作将起作用: 以下是完整问题的背景: (1.)成功为AWS CLI配置第二个配置文件后,我尝试在bash会话中使用以下命令将配置文件设置为user2,但未成功: ... 根据此处的建议:https://docs.aws.amazon.com/cli/latest/userguide/cli

  • 问题内容: 有人尝试过基于静态文件夹代码片段的此片段flask配置吗? 代码: 就我而言,我抱怨这条线: 错误信息: 有谁能通过Flask中的config.py文件设置static_folder? 问题答案: 对该片段一无所知,但是 永远不是有效的Python(Python没有l值)。看起来好像有一个类似dict的界面,所以令人反感的行应该只是 在setter上方的getter定义中可能存在复制和

  • 本文向大家介绍如何在nginx中配置缓存静态文件,包括了如何在nginx中配置缓存静态文件的使用技巧和注意事项,需要的朋友参考一下 这篇教程说明你应该怎样配置 nginx、设置 HTTP 头部过期时间,用 Cache-Control 中的 max-age 标记为静态文件(比如图片、 CSS 和 Javascript 文件)设置一个时间,这样用户的浏览器就会缓存这些文件。这样能节省带宽,并且在访问你

  • 任何指针都将有所帮助。 谢谢,阿希什

  • 我们的简介如下: 对于我们的测试环境,我们有两个属性文件(在src/main/test/resources下)应用程序本地。性质和应用。属性文件。计划是使用本地应用程序。“本地”配置文件模式下的属性(在我们的开发windows系统上)和应用程序。其他配置文件模式的属性。在spring上下文(spring context.xml)中,目前,我们正在根据使用的配置文件在两个属性文件之间手动切换。正在寻

  • 本文向大家介绍django中静态文件配置static的方法,包括了django中静态文件配置static的方法的使用技巧和注意事项,需要的朋友参考一下 环境 centos7 django 1.11 nginx 白话 我们可以使用Template 设置我们的网页,同时,一个完美的网页需要css,js,image 等静态文件的支持。 django中配置方式貌似有不少总,因为很多相关的博客写的方式并不一