首页 > 解决方案 > 在 Java 应用程序中引入 [boolean] 配置标志/参数的模式/习惯用法是什么?

问题描述

我有一个 Java 应用程序(准确地说是用 antlr4 编写的解释器),代码中有很多选项,我希望 [power] 用户可配置。类似于 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 程序员自然会写的那样。我很确定我现在拥有的不是它。

标签: javaconfigurationbooleanconfiguration-files

解决方案


我不知道有一种普遍接受的“最佳”方法。我的偏好不是每个标志都有一个单独的类,而是将所有标志集中在一个名为Config. 它的公共 API 可能类似于以下内容(假设标志被调用x,yz):

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.

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


推荐阅读