为什么人们在Scala的另一个对象中定义类,特征,对象?
好的,我会解释为什么我问这个问题。这几天我开始阅读Lift 2.2源代码。
如果你以前读过升级源代码,这是很好的。 在电梯中,我发现,定义内部类和内部特征非常重要。 对象Menu有2个内部特征和4个内部类。对象Loc有18个内部类,5个内部特征,7个内部对象。 有这么多的代码写这样。我想知道为什么作者这样写。 是因为它是作者的 解决方法
在2.8之前,你必须在包和对象之间进行选择。软件包的问题是它们不能自己包含方法或值。所以你必须将所有这些放在另一个对象中,这可能会变得尴尬。注意:
object Encrypt { private val magicConstant = 0x12345678 def encryptInt(i: Int) = i ^ magicConstant class EncryptIterator(ii: Iterator[Int]) extends Iterator[Int] { def hasNext = ii.hasNext def next = encryptInt(ii.next) } } 现在您可以导入Encrypt._并获得对encryptInt以及EncryptIterator类的访问权限。便利! 相反, package encrypt { object Encrypt { private[encrypt] val magicConstant = 0x12345678 def encryptInt(i: Int) = i ^ magicConstant } class EncryptIterator(ii: Iterator[Int]) extends Iterator[Int] { def hasNext = ii.hasNext def next = Encrypt.encryptInt(ii.next) } } 这不是很大的区别,但是它使用户导入encrypt._和encrypt.Encrypt._,或者必须不断地写入Encrypt.encryptInt。为什么不只是使用一个对象,如第一个模式? (真的没有性能损失,因为嵌套类实际上并不是Java内部类,它们只是JVM知道的常规类,但是有一些花哨的名字告诉你它们是嵌套的。) 在2.8中,你可以用你的蛋糕,也可以使用它:调用一个包对象,编译器会为你重写代码,所以它实际上看起来像是第二个例子(除了对象Encrypt实际上被称为包内部),但是像命名空间方面的第一个例子 – vals和defs就在那里,而不需要额外的导入。 因此,在2.8之前开始的项目通常使用对象来包装很多东西,就像它们是一个包。后2.8,主要动机之一已被删除。 (但是要清楚,使用对象仍然不会受到伤害;更重要的是它在概念上是误导性的,而不是对性能有负面影响。) (请,请不要试图实际加密任何东西,除了作为例子或笑话!) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |