【问题标题】:Java - Read out system environment during startupJava - 在启动期间读出系统环境
【发布时间】:2015-10-05 09:43:15
【问题描述】:

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

我需要例如os.name 并设计了一个类似

的类
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. 我想在类实例化后立即读出这些信息。因此构造函数调用了readSystemSettings()函数。

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

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

【问题讨论】:

  • 这属于代码审查...

标签: java environment-variables system


【解决方案1】:

你可以有一个所有变量都标记为 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,并在使用 @PostContruct 注释的方法中初始化变量。

public class SystemProperties{

  public static String OS_NAME;
  // other properties

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

  }

}

【讨论】:

    【解决方案2】:

    您可以使用实用程序类:

    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 从代码中的任何位置访问此属性。

    【讨论】:

      【解决方案3】:

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

      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");
          }
      

      【讨论】:

        【解决方案4】:

        您可以使用 OWNER 库。

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

        所以要加载属性,你应该像这样创建类

        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/

        【讨论】:

          猜你喜欢
          • 2012-03-29
          • 2015-09-12
          • 1970-01-01
          • 2021-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-26
          相关资源
          最近更新 更多