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

2023-11-24

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

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 file.

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

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


这是我过去使用过的一段代码 - 可以适应您的示例:

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Keytool 应用程序在哪里?

    我需要在android中使用mapview控件 但我似乎不明白如何运行keytool 是用eclipse安装的吗 我好像找不到下载链接 Thanks keytool http docs oracle com javase 7 docs te
  • HashMap不写入数据库

    我尝试在我的数据库中写入 但只写入发件人和消息 我不明白为什么会发生这种情况 我认为问题出在我使用 sendMessage 的地方 我认为问题是我没有什么可以做的读 写其他用户的主键 我在数据库中写入消息的活动 public class M
  • 未找到 MessageSource 的 ResourceBundle [消息]:找不到基本名称消息的包

    在 applicationContext xml 中 我定义了 MessageSource 如下所示
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 如何通过 Inno Setup for NetBeans 使用自定义 .iss 文件

    我将 Inno Setup 5 与 NetBeans 8 一起使用 并且我已经能够创建一个安装程序来安装该应用程序C users username local appname 但是我希望将其安装在C Programfiles 我如何在 Ne
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • R 中 qnorm() 函数

    我已阅读有关的文档qnorm 但无法真正理解它的作用 你能详细回答一下什么吗qnorm does 注意 请原谅我问这么简单的问题 我是 R 初学者 功能qnorm 旨在找到边界值 AP X lt A 给定概率 P 例如 假设您想要查找平均值
  • Django-OAuth-ToolKit :使用 OAuth2.0 的客户端凭据授予类型为多个资源/服务生成访问令牌

    我有几个后端 API 它们是 Django 项目 他们有一个用户界面 单页应用程序 和一个基于用户名密码的登录 我的客户通常是开发人员 他们不需要 UI 他们想要的只是访问后端 API 并且他们可以构建自己的仪表板等 他们希望将 API 与
  • 修复损坏的 neo4j 数据库(2.3.2 社区)

    我的 neo4j 2 3 2 community 数据库磁盘空间不足 80G 我彻底关闭了它 然后添加了更多磁盘 并尝试重新启动它 结果却收到神秘的错误消息 并且它拒绝启动 今天早上 当我意识到磁盘已满并且不再接受任何插入时 我将其关闭 直
  • 使用替换的运算符 new 进行 Clang 链接时优化会导致 valgrind 中的 free()/delete 不匹配

    当使用 clang 3 5 0 和 flto 并链接到共享库时 似乎调用operator delete在共享库中不遵循与调用相同的符号解析顺序operator new从主要对象来看 例子 共享 cpp void deleteIt int p
  • java.lang.IllegalStateException:尝试在关闭的 EntityManagerFactory 上执行操作

    我有 Eclipse Indigo 用于使用 Glassfish 3 开源开发 JSF 2 项目 这在我的计算机中 然后在我的 EC2 实例中 在 Amazon AWS 中 对于这两个 Glassfish 我创建了一个 JDBC 连接池以与
  • Sql 查询 - 限制查询结果

    我非常确定我们不能使用 LIMIT 子句来实现我想要做的事情 所以想知道是否还有其他方法可以实现这一点 我有一个表捕获哪个用户访问了哪个商店 每次用户访问商店时 都会在该表中插入一行 一些字段是 Shopping id 主键 store i
  • 删除一些以前的数据后,如何重新启动 PostgreSQL 中表的 id 计数?

    我在 Rails 2 3 8 上使用 PostgreSQL 数据库 我需要在我的表上重新启动自动增量 ID 我怎样才能做到这一点 如果截断表 则可以在末尾使用 RESTART IDENTITY 子句 例子 TRUNCATE TABLE fo
  • 如何使用WebClient进行零拷贝上传和下载?

    您可以使用 Spring 5 WebFlux 执行零拷贝上传和下载吗org springframework web reactive function client WebClient 你是对的 从基于文件的数据发布数据时 目前支持零复制R
  • Azure B2C 禁用 SignUpAndSignIn 策略的注册

    我需要一些有关自定义 Azure B2C 的建议 我一直在研究基于门户的定制和身份体验框架 我的关键要求是完全控制登录体验的外观和感觉 但是 用户不能注册 因为这是由单独的业务流程处理的 我了解我无法使用简单的登录策略 因为 B2C 不提供
  • 什么是 NullPointerException,如何修复它?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 什么是空指针异常 java lang NullPointerException 以及是什么导致了它们 可以使用哪些方法 工具来确定原因 以便阻止异常导致程序提前
  • Python:gettext 在 Windows 上不加载翻译

    这段特定的代码在 Linux 上运行得很好 但在 Windows 上则不然 locale setlocale locale LC ALL gettext bindtextdomain exposong LOCALE PATH gettext
  • iOS,ld:找不到架构arm64的GoogleMaps框架

    我正在开发一个使用谷歌地图的应用程序 我会解释我用谷歌地图做了什么 也许你可以帮助我 我在没有 POD 的情况下使用 Google 地图框架 但在出现一些关于 Google 地图密钥的错误后 我删除了 google 地图框架参考 并使用 P
  • 动态壁纸水波纹效果

    我正在制作一个动态壁纸 其中包含触摸屏幕时的一些水波纹效果 但我有点卡住了 创建多个图像并循环它们以创建波纹动画会更好吗 或者在将位图放置在画布上之前稍微扭曲位图会更好吗 This是一个通过 OpenGL 实现的非常漂亮的波纹效果的视频 我
  • 如何获取 iframe 中 PDF 文档加载的高度

    有没有办法获取 iframe 中加载的 PDF 内容的实际高度 我在 iPAD 设备中滚动 PDF 内容时遇到问题 我可以获得正文内容的高度 使滚动成功 但仅限于 HTML 页面 this contentWindow document bo
  • Elastic Search 和“子查询”

    可以在Elastic Search中执行子查询吗 我正在查找文档列表 通常大约 5 20 个文档 对于每个文档 我想执行搜索以为其提供一些自定义字段 每个文档都是一个属性 并且 我想分析找到的每个属性的周围属性 以评估其周围属性的平均价格
  • Java 8 将 Map> 转换为 Map>

    我需要转换Map
  • Firebase 功能会减慢冷启动时间

    I read here端点旋转应该是透明的 我认为这意味着冷启动时间不应与常规执行时间不同 现在还是这样吗 我们的所有端点的冷启动时间都非常慢且无法使用 大约 16 秒 冷启动 Function execution took 16172 m
  • 无法将“System.Data.Common.DataRecordInternal”类型的对象转换为“System.Data.IDataReader”类型

    当尝试创建时thislinq 语句 我遇到了以下错误 无法转换 System Data Common DataRecordInternal 类型的对象 输入 System Data IDataReader 这就是我按照 SLaks 所做的有
  • C# - Listview 列标题高度(Windows 窗体)

    如何更改 ListView 中列标题的高度 视觉工作室 2008 Windows 窗体 这并不容易 但可以做到 基本策略是从ListView 使用 LVM GETHEADER 消息 设置NativeWindow该控件上的实例 然后侦听 HD
  • 如何从硬编码静态配置文件切换到 .properties 文件?

    我有一些代码使用一个包含大量硬编码常量的类 它看起来是这样的 class Constants public static final String name1 value1 public static final String name2