java—应用程序配置的代码访问方便

frebpwbc  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(309)

我在应用程序中遇到了一个与配置相关的设计问题。
假设我们有一个很大的域,可以分成几个子域。每个子域应该尽可能使用相同的通用代码,所有的差异应该存储在配置中-每个子域一个。子域配置项可以存在于许多子域中,并且其中一些项只能对一个子域唯一。想象一下这个简单的例子:不同国家的某些税收价值可能是相同的,但另外也可能有其他国家没有的价值。
大多数配置项都是一些对象的数组,由于业务逻辑的原因,我希望能够通过一些常量(就像枚举)快速访问每个项。我不想将加载的值保存在数组、列表或类似的结构中,并准备每次都搜索正确值的代码—我害怕性能损失。
我的想法是创建一些通用的抽象类,将数据保存在一个列表中,并为每个子域创建子类,其中包含引用每个值的常量,但从维护的Angular 来看,这听起来不太好。
我正在考虑用yaml或json格式保存这样的配置。
是否有任何设计模式,有助于实现令人满意的结果?或者我的整个概念都错了?这个配置是整个应用程序的基础,我希望在项目太高级时避免潜在的问题。

ogsagwnx

ogsagwnx1#

由于您希望访问配置值(几乎)和访问常量值一样快,这表明配置数据将在应用程序启动时只读,并且在应用程序运行期间不会动态地重新读取。这有两种可能。
第一种可能是在应用程序启动时执行以下操作。将整个配置文件读入名为 cfg 提供以下操作: String lookupString(String name) , int lookupInt(String name) 以及 boolean lookupBoolean(String name) . 然后使用这些操作查询特定于子域的配置值,并将这些值存储在定义特定于子域的java对象中。例如, TaxConfig , LoggingConfig , CountryConfig , DatabaseConfig 等等可以是存储特定于其各自子域的配置数据的类。这样,相对较慢的 cfg 对象仅在应用程序启动时用于填充 XXXConfig 为命名配置变量(存储为字段)提供大量getter和setter的对象。这样,应用程序调用中对延迟敏感的代码会进行如下调用 taxConfig.getVatRate() . 因为这样的调用很简单(它们只返回一个字段的值),所以速度很快。如果你声明那些getter操作 final ,那么jit编译器甚至可以内联调用它们,从而加快访问速度。
第二种可能性出现在配置数据一次静态数月/数年的情况下。在这种(不太可能的)情况下,您可以编写一个代码生成器来读取(简明的)输入配置文件并生成(更详细的)包含常量值的java类。然后根据这些类编译应用程序代码。

相关问题