Scala:加载Java属性

6

以下是易于阅读和理解的 Scala 代码,用于加载 Java 属性。与以下 Java 代码相对应:

    try {
        Properties prop = new Properties();
        prop.load(new FileInputStream("config.properties"));
        this.host = prop.getProperty("mongo.host");
        this.port = new Integer(prop.getProperty("mongo.port"));
        this.dbName = prop.getProperty("mongo.db");
        this.docsCollName  = prop.getProperty("mongo.coll.docs");
    } catch (Exception e) {
        e.printStackTrace();
        System.exit(1);
    }

谢谢!


6
请先自己试一试!如果有任何问题,请回来与我联系。 - maba
2个回答

19
I will certainly recommend the typesafe config, written by the company behind Scala and used at least by Akka framework.
功能(引用自维基):
  • 使用纯Java实现,无需依赖
  • 广泛的测试覆盖率
  • 支持三种格式的文件:Java属性、JSON和人性化的JSON超集
  • 合并所有格式的多个文件
  • 可以从文件、URL或类路径加载
  • 对“嵌套”有良好的支持(将配置的任何子树视为整个配置)
  • 用户可以使用Java系统属性覆盖配置,java -Dmyapp.foo.bar=10支持从单个文件(例如application.conf)配置应用程序及其框架和库
  • 解析持续时间和大小设置,“512k”或“10秒”
  • 转换类型,因此如果您要求布尔值并且该值是字符串“yes”,或者您要求浮点数并且该值是整数,则会自动进行转换。
  • JSON超集功能: 注释 包含 替换(“foo”:$ {bar},“foo”:Hello $ {who}) 类似属性的表示法(a.b=c) 更少嘈杂,更宽松的语法 替换环境变量

示例:

Config conf = ConfigFactory.load();
int bar1 = conf.getInt("foo.bar");
Config foo = conf.getConfig("foo");
int bar2 = foo.getInt("bar");

1
它也在Scala 2.10.0及以后的发行版中。 - Viktor Klang
1
另一个使用它的原因,正如Viktor所说,任何时候在Scala 2.10中启动actors,您都依赖于akka-actors和config。[http://docs.scala-lang.org/overviews/core/actors-migration-guide.html] - fracca
1
是的,我同意你的推理,但有时您需要一些非常简单的东西,并且没有时间偏离主要目标并学习“另一个配置框架”。 - Anton Ashanin

13

如果你没有使用任何配置库,大多数情况下是相同的:

val (host, port, dbName, docsCollName) = 
  try {
    val prop = new Properties()
    prop.load(new FileInputStream("config.properties"))

    (
      prop.getProperty("mongo.host"),
      new Integer(prop.getProperty("mongo.port")),
      prop.getProperty("mongo.db"),
      prop.getProperty("mongo.coll.docs")
    ) 
    } catch { case e: Exception => 
      e.printStackTrace()
      sys.exit(1)
    }

val (host, port, dbName, docsCollName) 是什么?它是匿名元组还是列表?在哪里可以阅读到这个结构的相关信息?(我在文档中还没有看到过这样的结构) - Anton Ashanin
3
@AntonAshanin 这是一种解构赋值(destructuring assignment)的方式,它会获取 try 块中的结果(在成功的情况下),然后将返回的值分配给一组本地值。这样,您就可以只使用 vals 而不使用 vars。 - om-nom-nom
非常酷,也非常有趣)) 例如:val(x,z)=(123,“xexe”.toInt)。如果赋值块内发生异常-则不会实例化任何变量。确实是非常具有预测性的编程 - 最大的惊喜保证!)) - Anton Ashanin
2
@AntonAshanin 嗯,如果出现问题就调用 System.exit(),那么你为什么在意实例化呢? - om-nom-nom
@om-nom-nom 在 sys.exit 上加 1。@AntonAshanin,由于在 Scala 中 try 是一个表达式而不是语句,你可以用 try { Integer.valueOf(prop.getProperty("mongo.port"))} catch { case e: Exception => defaultIntegerValue } 替换 new Integer(prop.getProperty("mongo.port")),如果整数解析失败,它将返回 defaultIntegervalue - Bruno Grieder
@AntonAshanin请避免使用易于讽刺的语言,因为这种语言在此处脱离了上下文,我们正在尝试帮助您。 您可以采用诸如此gist中所示的尝试(Try)等方式来使您的程序更具“预测性”。 - pagoda_5b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接