如何管理Java库的内部配置设置?

如何管理Java库的内部配置设置?,java,configuration,Java,Configuration,我正在开发一个Java库,可以在Android、Web和桌面应用程序中使用。该库由几个主要分离的模块组成,这些模块共享公共配置设置(例如“已启用”、“api密钥”) 目标 配置应允许在运行时进行更改(例如Android中的API、JMX或SharedPreferems),而不影响可移植性(例如无数据库)、可测试性或线程安全性(某些模块在单独的线程中运行) 方法 我当前使用的是我在启动时创建的配置对象,并将其传递给各个模块(模块本身将其传递给子类)。然后,每个类将其所需的字段复制到本地字段-唯一的

我正在开发一个Java库,可以在Android、Web和桌面应用程序中使用。该库由几个主要分离的模块组成,这些模块共享公共配置设置(例如“已启用”、“api密钥”)

目标

配置应允许在运行时进行更改(例如Android中的API、JMX或SharedPreferems),而不影响可移植性(例如无数据库)、可测试性或线程安全性(某些模块在单独的线程中运行)

方法

我当前使用的是我在启动时创建的配置对象,并将其传递给各个模块(模块本身将其传递给子类)。然后,每个类将其所需的字段复制到本地字段-唯一的问题是:无法在运行时更改设置

其他想法:

  • 使用静态:难以测试
  • 向模块传递引用:线程安全
这里的最佳解决方案/最佳做法是什么?


更新:需要澄清的是,模块不需要知道是否对配置进行了更改,只需直接使用字段的新值,然后再使用它即可。

一些建议:

  • 不要将每个类需要的字段复制到本地字段;始终从配置对象访问属性(应在配置对象上执行任何缓存管理)
  • 确保使用config对象的任何类都不会以任何方式(通过插入、删除键或更改其值)直接修改它
  • 在实例化时预加载配置对象中所需的所有信息
  • 将配置对象设置为单例,并在所需的客户端之间共享它
  • 为配置对象提供一种机制,以逐出任何不再有效的缓存项
  • 使用Observer模式使缓存保持最新
    • 一些建议:

      • 不要将每个类需要的字段复制到本地字段;始终从配置对象访问属性(应在配置对象上执行任何缓存管理)
      • 确保使用config对象的任何类都不会以任何方式(通过插入、删除键或更改其值)直接修改它
      • 在实例化时预加载配置对象中所需的所有信息
      • 将配置对象设置为单例,并在所需的客户端之间共享它
      • 为配置对象提供一种机制,以逐出任何不再有效的缓存项
      • 使用Observer模式使缓存保持最新

      感谢您的建议-一个问题,当您说“在所需的客户端之间共享”时,您的意思是存储对它的引用吗?是的,这样配置对象的所有客户端都将看到相同的最新信息感谢您的建议-一个问题,当您说“在所需的客户端之间共享”,你的意思是存储对它的引用吗?是的,这样配置对象的所有客户端都会看到相同的最新信息我自己有另一个想法:通过在ConfigItem中包装每个配置字段,我可以创建一个AndroidConfigItem,包装每个get(),检查SharedReferences是否已更改,想法?我想,查看了ehcache的源代码以了解它们是如何做到的,并得出结论:Óscar的概念(观察者模式)是meI的最佳方法。我自己有另一个想法:通过在ConfigItem中包装每个配置字段,我可以创建一个AndroidConfigItem,包装每个get(),检查共享引用是否发生了更改,想法?我想了想,查看了ehcache的源代码,看看他们是如何做到的,并得出结论,Óscar的概念(观察者模式)是我最好的方法