目前我正在尝试使用Scala编写API。此API应处理文件后端,如Smb,S3,FileSystem Storage等。
所以我写了一些像Storage
这样的类,它是存储后端的基类,而FileSystemStorage
,SmbStorage
这样的子类是Storage
的子类,但从现在开始,我如果我在设置文件中指定它们,我想使用这些类。
我希望它像在Django中一样:https://docs.djangoproject.com/en/1.6/ref/settings/#std:setting-DEFAULT_FILE_STORAGE我可以指定一个字符串,到我的默认存储引擎。
然后它应该“神奇地”工作,以便我可以使用DefaultStorage访问FileSystemStorage
或SmbStorage
,也应该可以创建更多“存储”类。这有可能吗?
目前我有一些想法可以实现这一点,但我不确定这是否是斯卡拉的好习惯。
答案 0 :(得分:1)
JVM类已经动态加载。你想要的是动态选择一个实例。
您可以执行以下操作:
def byName(name:String) = name match {
"FileSystemStorage" => FileSystemStorage
"SmbStorage" => SmbStorage
}
我假设这些是对象。如果他们是课程,只需添加new
关键字。
现在,如果在编译时类名未知,则可以执行Class.forName(full_qualified_classname)
。但是这会给你一个Class
对象,而不是类的实例,在这种情况下你需要调用newInstance
(假设它有一个无参数的构造函数)。您描述问题的方式表明您不希望采用这种方法。