在Java 应用程序中引入[boolean] 配置flags/parameters 的patterns/idioms 是什么?
What are the patterns/idioms for introducing [boolean] configuration flags/parameters in a Java application?
我有一个 Java 应用程序(准确地说是一个用 antlr4 编写的解释器),在代码中有许多选项,我希望 [power] 用户可配置。类似于 config.properties 文件。其中大部分是布尔标志,如果设置,则执行此操作,否则执行此操作。
目前,我每个标志有一个 class,classes 分散在整个代码中,大部分在实现需要它的同一个包中。而且,你可以说:
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 文件似乎是正确的用户界面。
但是,属性读取字符串,我是否检查 yes/no、true/false?设置标志。或者有更好的办法吗?
我是否也应该将所有选项都作为一个 class 的一部分,然后将它们存储在地图中?什么会使添加配置选项变得最简单?
最重要的是,我想遵循某种形式的 Java 最佳做法。我不想成为那个可以用任何语言编写 FORTRAN 的人。我希望代码看起来像其他 Java 程序员自然会编写的代码。我很确定我现在拥有的不是它。
我不知道对此有普遍接受的“最佳”方法。我的偏好是 而不是 每个标志都有一个单独的 class,而是将所有标志集中在一个 class 中,例如 Config
。它的 public API 可能类似于以下内容(假设标志被称为 x
、y
和 z
):
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
的实例作为参数传递给许多不同的 operations/constructors,那么您可以创建 [=11 的单例实例=].
我认为我上面的建议不会在程序员中引起太多争议。更有可能引起争议的是关于初始化 Config
对象的“最佳”方式的意见。有些人可能会建议应该使用 Spring 框架来注入从 XML 文件中获取的值。其他一些人可能会建议您的 setup()
操作应该以您最喜欢的语法(属性、JSON、XML 或其他)从配置文件中读取值,并且可能允许命令-覆盖配置文件中指定值的行选项
我有一个 Java 应用程序(准确地说是一个用 antlr4 编写的解释器),在代码中有许多选项,我希望 [power] 用户可配置。类似于 config.properties 文件。其中大部分是布尔标志,如果设置,则执行此操作,否则执行此操作。
目前,我每个标志有一个 class,classes 分散在整个代码中,大部分在实现需要它的同一个包中。而且,你可以说:
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 文件似乎是正确的用户界面。
但是,属性读取字符串,我是否检查 yes/no、true/false?设置标志。或者有更好的办法吗?
我是否也应该将所有选项都作为一个 class 的一部分,然后将它们存储在地图中?什么会使添加配置选项变得最简单?
最重要的是,我想遵循某种形式的 Java 最佳做法。我不想成为那个可以用任何语言编写 FORTRAN 的人。我希望代码看起来像其他 Java 程序员自然会编写的代码。我很确定我现在拥有的不是它。
我不知道对此有普遍接受的“最佳”方法。我的偏好是 而不是 每个标志都有一个单独的 class,而是将所有标志集中在一个 class 中,例如 Config
。它的 public API 可能类似于以下内容(假设标志被称为 x
、y
和 z
):
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
的实例作为参数传递给许多不同的 operations/constructors,那么您可以创建 [=11 的单例实例=].
我认为我上面的建议不会在程序员中引起太多争议。更有可能引起争议的是关于初始化 Config
对象的“最佳”方式的意见。有些人可能会建议应该使用 Spring 框架来注入从 XML 文件中获取的值。其他一些人可能会建议您的 setup()
操作应该以您最喜欢的语法(属性、JSON、XML 或其他)从配置文件中读取值,并且可能允许命令-覆盖配置文件中指定值的行选项