在Java应用程序中引入[布尔]配置标志/参数的模式/习惯用法是什么



我有一个Java应用程序(确切地说,是一个用antlr4编写的解释器(,代码中有很多选项,我希望可以由用户配置。类似于config.properties文件。其中大多数是布尔标志,如果设置了,则执行此操作,否则执行此操作。

目前,我每个标志有一个类,这些类分散在代码中,大多在实现需要的同一个包中

import  my.package.DoThis;
if (DoThis.isSet()) {
doThis();
} else {
doThat();
}

DoThis的代码类似于

package my.package;
public class DoThis {
private static Boolean doThis = true; // the default
public static Boolean isSet() { return doThis; }
public static void set() { doThis = true; }
public static void clear() { doThis = false; }
}

而且,main调用的代码中有一个集中的部分,用于初始化这些选项。

public void setup() {
DoThis.set();
DoAnother.clear();
if (cmd.option.debug()) { DoThird.set(); } else { DoThird.clear(): }
}

但是,正如我所说,我想清理代码,并使用一个配置文件,我可以将其保存在资源中,或者高级用户可以覆盖它。属性文件或json文件似乎是正确的用户界面。

但是,属性读取字符串,我是否检查是/否、真/假?设置标志。或者还有更好的办法吗?

我是否也应该将所有选项作为一个类的一部分,并可能将它们存储在地图中?是什么使添加配置选项变得最容易?

最重要的是,我想遵循某种形式的Java最佳实践。我不想成为那种能用任何语言编写FORTRAN的人。我希望代码看起来像其他Java程序员自然编写的代码。我很确定我现在拥有的不是它。

我不知道一个普遍接受的"最好的";方法。我的偏好是而不是每个标志都有一个单独的类,而是将所有标志集中在一个名为Config的类中。它的公共API可能如下所示(假设这些标志被称为xyz(:

public class Config {
private boolean x;
private boolean y;
private boolean z;
void setX(boolean value) { x = value; }
boolean getX() { return x; }
void setY(boolean value) { y = value; }
boolean getY() { return y; }
void setZ(boolean value) { z = value; }
boolean getZ() { return z; }
}

如果您不想将Config的实例作为参数传递给应用程序中的许多不同操作/构造函数,那么您可以创建Config的单例实例。

我认为我上面的建议在程序员中不会引起太大的争议。更可能引起争议的是关于";最好的";初始化CCD_ 7对象的方法。有些人可能建议使用Spring Framework来注入从XML文件中获得的值。其他一些人可能建议您的setup()操作应该以您喜欢的语法(属性、JSON、XML或其他(从配置文件中读取值,并可能允许命令行选项覆盖配置文件中指定的值

最新更新