当前位置: 代码迷 >> java >> 静态特性
  详细解决方案

静态特性

热度:112   发布时间:2023-07-27 09:20:24.0

我在groovy中创建一个配置类,如下所示

class EnvironmentConfig {
    String configFilePath
    Config envConfig

    public EnvironmentConfig (String configFilePath) {
        this.configFilePath = configFilePath
        envConfig = ConfigFactory.load(configFilePath)
    }

    def propertyMissing(String name) {
        envConfig.getString(name)
    }
}

这个想法是,当我的应用程序启动时,该类仅应实例化一次,并且其他所有类都应该能够访问该类。 现在,我写了一个很小的主类来检查某些内容。

public static void main(String[] args) {
    EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
    println "${envConfig.TESS_WORKDIR}"
}

这很好,但是如果我这样写

public static void main(String[] args) {
    EnvironmentConfig envConfig = new EnvironmentConfig(envConf)
    println "${EnvironmentConfig.TESS_WORKDIR}"
}

它不起作用,我希望任何类都应该能够只使用EnvironmentConfig.TESS_WORKDIR并且应将调用路由到missingProperty方法,并在该方法中返回一些值。

似乎以下代码可以完成这项工作,但并未对其进行广泛的测试:

class EnvironmentConfig {
   Map m

   EnvironmentConfig (Map m) {
      this.m = m
      this.class.metaClass.static.propertyMissing = { name ->
         this.propertyMissing(name)
      }
   }

   def propertyMissing(String name) {
      this.@m[name]
   }
}

EnvironmentConfig envConfig = new EnvironmentConfig([TESS_WORKDIR:1])
assert envConfig.TESS_WORKDIR == 1
assert EnvironmentConfig.TESS_WORKDIR == 1
envConfig = new EnvironmentConfig([:])
assert envConfig.TESS_WORKDIR == null
assert EnvironmentConfig.TESS_WORKDIR == null
  相关解决方案