它是一种具有特征和同样命名的对象的好风格吗?

Pet*_*itz 8 scala

当我浏览Paul Phillips GitHub存储库时,我注意到他经常使用某种结构:

trait A {
 // ...
}
object A extends A
Run Code Online (Sandbox Code Playgroud)

例如这里:scala- improvement ,strings首先,来自Java,我不知道在同一范围内具有相同的特征和特征的对象.
现在我问它有什么好处?与所有特征成员直接定义对象有什么好处?好吧,我知道这个特性可以混入,但我假设在实践中只使用了这个对象.

Jea*_*let 11

至少有一种情况是这种模式派上用场的是当你构建一个函数库时.您可以重组功能(实际上的方法,但让我们称他们在这方面的功能)到几个特点(然后可以被视为模块),也就是说,MyLibA,MyLibB,MyLibC,等.然后,如果他们每个人,你定义一个对象实现它,你的lib的用户可以通过写,例如,这样轻松地使用它:

import mypackage.MyLibA._
Run Code Online (Sandbox Code Playgroud)

(假设mypackage是包含的包).此外,您可以通过提供如下对象轻松提供导入lib的所有功能的方法MyLib:

object MyLib extends MyLibA with MyLibB with MyLibC
Run Code Online (Sandbox Code Playgroud)

然后用户可以简单地导入mypackage.MyLib._而不是分别为每个模块编写导入.更好的是,您可以定义一个package object mypackage extends MyLibA with MyLibB with MyLibC,然后用户只需编写import mypackage._.而且,奖金是想谁挑剔的用户只进口MyLibAMyLibB在同一行也可以自由定义自己的"导入对象",甚至可能用自己的效用函数完成它,或者重写你自己:

object UserLibImport extends MyLibA with MyLibB {
    def userAdditionalFunction = /* ... */
    override def someRedefinedLibAFunction = /* ... */
}
Run Code Online (Sandbox Code Playgroud)

...然后导入所有内容 import UserLibImport._

所以,我想说,在这种情况下,它不仅是好的风格,强烈建议以这种方式提供你的功能,因为它允许最大的灵活性.

(这个答案也简要解释了这一点.)