我有一个工厂,它应该根据名称返回一个实现。
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.")
}
为了让每次调用getMoules方法都不创建实例,有一个映射,其中所有的模块都必须在bootstrap类中初始化。我想摆脱手动操作的需要(也是所有的类都有一个显著的特征)。
我想到的选项列表:
我们能把初始化过程移到编译时吗?
我知道编译器可以优化和替换代码,编译前的下一个片段
val a = 5 + 5
在编译编译器将该部分更改为10之后,我们是否可以使用一些指令或其他工具在编译时计算和执行一些代码,并只使用最终值?
你使用什么框架还是自己写?我在这里回答了关于Guice的类似问题。你也可以不用Guice使用它:你将拥有你的工厂,而不是Module
,你需要从某个地方初始化工厂,在初始化过程中,你将使用反射填充地图
总的来说,我认为这是最简单的方法。或者,您可以编写宏,它只是替换了反射初始化的一部分,但不确定它是否会给您带来一些好处(如果我正确理解您的问题,这个初始化只会在启动时发生一次)。
我不知道scalameta能帮到你什么?可能只有在所有实现都位于源代码树中的情况下,才能对其进行分析并生成初始化(类似于宏)?这可能会增加一些加号,比如更容易搜索实现,但会增加一些减号:只对源代码中的实现有效。
您的编译时优化示例不适用。在您的示例中,您讨论了编译时常量(即使使用算术,这也可能是一个问题,请参阅此注释),但在您的问题中,您需要特定的运行时行为。因此,在我看来,编译时
可能只是从宏或基于scalameta生成代码。
据我所知,在Java11中,这两个操作可以在一行中完成,不是吗?
冬眠。xml: 启动tomcat时出错: 2016年5月8日上午10:02:02组织。springframework。网状物上下文ContextLoader initWebApplicationContext严重:上下文初始化失败。springframework。豆。工厂BeanCreationException:创建名为“sessionFactory”的bean时出错,该名称在URL[文件:/D
本文向大家介绍Mysql5.6.36脚本编译安装及初始化教程,包括了Mysql5.6.36脚本编译安装及初始化教程的使用技巧和注意事项,需要的朋友参考一下 概述 本文为centos7.3自动化编译安装mysql5.3.6的脚本及后续初始化操作,话不多少,直接上脚本。 安装脚本install.py如下: 配置文件my.cnf 使用方法: 1.操作系统需要配置yum源 2.操作系统版本:centos7
我在listview(又称convertView)中的视图缓存有点麻烦,下面是我的代码, 这是我日志中的输出 位置:0应用程序空 位置:1应用程序不为空 位置:2个APP Not NULL 位置:3应用程序不为空 . . . 位置:10应用程序不为空 这会造成灾难,因为这意味着在后台作业中传递的textview是相同的textview,而更改的视图是相同的textview,而另一个textview
请考虑以下示例: 如果我理解正确的话,根据https://en.cppreference.com/w/cpp/language/zero_initialization,它不能抛出,因为应该对B::A执行零初始化,就像对“没有构造函数的值初始化类类型的成员”一样。 如果它抛出,是编译器错误还是我遗漏了什么? 编辑:我在英特尔网站上提交了一个bug:https://community.intel.co
Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a