【发布时间】:2026-02-13 07:50:01
【问题描述】:
我有一个工厂,它应该根据名称返回一个实现。
val moduleMap = Map(Modules.moduleName -> new ModuleImpl)
def getModule(moduleName: String): Module =
moduleMap.get(moduleName) match {
case Some(m) => m
case _ =>
throw new ModuleNotFoundException(
s"$moduleName - Module could not be found.")
}
为了使每次调用“getModule”方法不创建实例,必须在引导类中初始化所有模块的映射。 我想摆脱手动执行此操作的需要(所有类都有一个独特的功能)。
我想到的选项列表:
- 反射(我们可以使用 Scala 反射 API 或任何第三方
图书馆)
- 自动化流程。
- 需要在启动时立即初始化。
- 反思是一种痛苦。
- 元编程(ScalaMeta)+反射
- 宏只改变代码,执行在以后发生。
我们可以将初始化过程移到编译时吗?
我知道编译器可以优化和替换代码,编译前的下一个片段
val a = 5 + 5
在编译编译器将那部分更改为 10 后,我们可以使用一些指令或其他工具在编译时评估和执行一些代码并只使用最终值吗?
【问题讨论】:
-
或者你知道解决这个问题的另一种方法。
标签: scala reflection compilation factory scalameta