【发布时间】:2015-09-08 21:51:24
【问题描述】:
我使用的是 Intellij 14,在模块设置中,有一个导出依赖项的选项。
我注意到当我编写扩展特征的对象时,当其他模块尝试使用这些对象时,我需要在模块设置中选择 export。
例如,
object SomeObj extends FileIO
需要我导出 FileIO 依赖项。
但是,如果我编写一个伴随类,在调用对象时创建一个新实例,则不再需要导出。
object SomeObject {
private val someObject = new SomeObject()
def apply() = someObject
}
private[objectPkg] class SomeObject() extends FileIO {}
这段代码更冗长,有点像 Scala 的单例模式。 export 使用您的模块的第三方依赖项是否很好?如果不是,我的模式是 Scala 的典型解决方案吗?
【问题讨论】:
-
这一切都取决于你在做什么和长期目标。完全抽象出所有实现细节(例如一些第三方库来访问文件系统或数据库)可能需要更多的努力,但并不总是必要的。
-
@dmitry 我认为同意你的观点。你有什么时候不需要的个人指导方针吗?
-
一般都涉及代码设计原则。基本上,如果您以后可以切换底层的第三方库,或者您的系统必须灵活地移植到其他一些库上——那么必须将实现隐藏在某个外观后面。通常在 java/scala 中有一组现成的接口,它们在第三方中实现,您可以将这些接口用作系统其余部分的外观的一部分。如果不是这种情况 - 您将需要自己派生接口。这个价值大家根据上下文自己估计。
-
根据您的情况:请记住,在 java/scala 中,您导出 names,并且如果您只想以任何方式使用您的类(扩展
FileIO)外部(您的定义代码),这意味着该类可以公开访问,并且其类型也可以导出/泄漏到外部。 Scala 应该抛出编译错误,如果某些私有类超出了它的可见性范围,所以,我不确定你将如何利用你的SomeObject.apply。怎么样? -
这只是我一直用于实用程序包的一般模式。我想我明白你所说的要点。您是否介意在下面发布您的答案,以便我将其标记为正确。
标签: scala dependencies singleton