Java - 启动时读出系统环境

Java - Read out system environment during startup

在 Java 应用程序和 class 可见性函数中读取系统环境的最佳方法是什么?

我需要例如os.name 并设计了一个 class 像

private String osName; 

private void readSystemSettings() {
    osName = System.getProperty("os.name");
}

public void printSystemSettings() {
    System.out.println(this.osName);
    ...
}

public SystemEnvironment() {
    readSystemSettings();       
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
}
  1. 获取这些信息的最佳做法是什么? 始终在启动时调用此函数还是偶尔调用?

  2. 我想在 class 实例化后立即读出这些信息。因此构造函数正在调用 readSystemSettings() 函数。

由于这些信息在运行时总是相同的,所以我实际上不需要任何立场。意味着所有变量+函数都是最终的。还是我错了?

  1. 如果2)理解正确,怎么办?

您可以使用实用程序 class:

public final class Utilities {

    public static final String OS_NAME = System.getProperty("os.name");

    private Utilities() { } // utility classes can't be instantiated

}

这样,这个 属性 只会在您的应用程序启动期间初始化一次。然后,您可以使用 Utilities.OS_NAME.

从代码中的任何位置访问此 属性

由于该值是全局设置的,您可以这样做

enum SystemEnvironment {
    ;
    public static final String OS_NAME = System.getProperty("os.name");

或者您可以每次都查看 ti,因为您不应该经常调用它。

enum SystemEnvironment {
    ;
    public static getOsName() {
         return System.getProperty("os.name");
    }

如果您经常使用它,我建议为它创建一些测试。

enum SystemEnvironment {
    ;
    public static final boolean IS_WINDOWS = getOsName().startsWith("Window");
    public static getOsName() {
         return System.getProperty("os.name");
    }

您可以使用 OWNER 库。

OWNER API 是一个 Java 库,其目标是通过 Java 属性文件最小化处理应用程序配置所需的代码。

所以要加载属性,您应该像这样创建 class

public interface MyConfig extends Config {
    @Key("os.name")
    String osName();
}

然后你可以随时加载配置:

ServerConfig cfg = ConfigFactory.create(MyConfig.class,
        System.getProperties(), 
        System.getenv()
);
System.out.println("Os name:" + cfg.osName());

有关详细信息,请参阅文档 http://owner.aeonbits.org/docs/usage/

你可以有一个 class,所有变量都标记为 final,然后在静态块中初始化。

public class SystemProperties{

  public static final String OS_NAME;
  // other properties

  static{
    OS_NAME = System.getProperty("os.name");
    // initialize other properties

  }

}

否则,如果您处于 Spring 或 EJB 等托管环境中,您可以将 SystemProperties 标记为 singleton 并在用 [=14 注释的方法中初始化变量=].

public class SystemProperties{

  public static String OS_NAME;
  // other properties

  @PostConstruct
  private void init(){
    OS_NAME = System.getProperty("os.name");
    // initialize other properties

  }

}