我是一位相对较新的Scala用户,我希望对我的代码的当前设计有所了解。
我有几个类都表示为固定长度Vector [Byte](最终它们用于需要字节串的学习算法),比如A,B和C. 为了便于阅读,我希望这些类在包中的其他位置被称为A,B和C,并且我不需要为这些方法向Vector添加任何额外的类方法。因此,我不认为extend-my-library模式在这里很有用。 但是,我想包括Vector附带的所有有用的功能方法,而不必钻研'每次进入包装器对象。由于效率在这里很重要,我也不想要增加包装纸的重量。
因此我决定在包对象中定义类型别名:
package object abc {
type A: Vector[Byte]
type B: Vector[Byte]
type C: Vector[Byte]
}
然而,每个人都有自己的固定长度,我想包括他们创建的工厂方法。这似乎是伴侣对象的用途。这就是我最终设计的样子:
package object abc {
type A: Vector[Byte]
object A {
val LENGTH: Int = ...
def apply(...): A = {
Vector.tabulate...
}
}
...
}
一切都在编译,它允许我做这样的事情:
val a: A = A(...)
a map {...} mkString(...)
我无法找到任何针对类型别名编写伴随对象的警告,但似乎不应该使用类型别名。它还意味着所有这三个类都在同一个文件中定义,理想情况下它们应该分开。
感谢。
答案 0 :(得分:4)
我想这完全没问题,因为你并没有真正实现一个伴侣对象。
如果您是,您可以访问immutable.Vector
内的object A
的私人字段(例如private var dirty
),这是您没有的。
因此,尽管有些感觉A
是一个伴侣对象,但它确实不是。
如果可以通过使用类型别名为任何类型创建伴随对象,则会使成员可见性约束失败(除了private|protected[this]
之外)。
此外,像对象类型一样命名对象可以澄清对象的上下文和目的,这在我的书中是 plus 。
将它们全部放在一个文件中就像我所知的那样在scala中非常常见(例如,在使用类型类模式时)。
因此: 我知道没有陷阱。 并且,imho,不需要采用不同的方法。