你能在Scala中动态导入吗?

时间:2015-04-28 12:54:10

标签: scala

我的项目依赖于一个包含路径日期的包的库,例如:

import xyz.abc.201301.utils._

其中201301是注明日期的版本。

有没有办法在一个地方声明这个包名,以便我可以在使用这个依赖项的各个类中引用它? 这样,当版本更改时,我只需要在我的代码中的一个位置更改它。

理想情况下,我想象我可以宣布

val libVersion = 201301

在一个地方,然后在客户端类中:

import xyz.abc.$libVersion.utils._

我知道这不起作用,但是有办法做类似的事吗?

2 个答案:

答案 0 :(得分:4)

简答:不。

答案很长:你可以以某种方式完成这项工作。您可以使用模板语言或排序预处理器,然后创建一个构建过程,在将Scala模板文件交给编译器之前对其进行预处理。

但这不是一个好主意。这正是Maven或SBT等依赖管理系统的开发目标。在您的上下文中,版本化模块的概念是:您保留相同的包名称,而包名称中没有日期。您创建一个也管理依赖关系的构建过程;为此,您可能希望使用Maven或SBT。 (后者更适合Scala。)您确保您所依赖的代码作为单独的模块提供,其中包含"快照"版本,即每次解决依赖关系时,都会创建一个新版本。

如果你不想要或不能实现这样的过程,我建议至少限制损害。您可以创建一个中央包,其中包含您需要使用的所有类型和对象:

package object current_api {
  // for types, i.e. traits or classes:
  type SomeType = xyz.abc.201301.SomeType
  // for singleton objects:
  val SomeCompanionObject = xyz.abc.201301.SomeCompanionObject
}

您更改构建过程,以便从各种模板生成此Scala文件;我对您的构建过程了解不足以形成推荐。

使用API​​的代码可以简单地使用相同的导入:

import current_api._

// ...
val someInstance:SomeType = SomeCompanionObject.apply(arg1, arg2)

通过这种方式,您可以限制与日期相关的"进口"只有一个文件。

答案 1 :(得分:1)

您无法动态导入,但可以使用反射动态调用。

如果库是Java,则可以使用Java reflection。如果是Scala,reflection library仍然标记为实验性的。

在任何一种情况下,我都与Madoc合作 - 除非你真的需要,否则不要去那里。写作困难,难以阅读,如果在热点地区,很慢。

无论是谁打包......(单词失败)。