Scala类型别名与伴随对象

时间:2015-08-29 13:03:52

标签: scala vector companion-object type-alias

我是一位相对较新的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(...)

我无法找到任何针对类型别名编写伴随对象的警告,但似乎不应该使用类型别名。它还意味着所有这三个类都在同一个文件中定义,理想情况下它们应该分开。

  1. 这种方法有什么隐藏的问题吗?
  2. 这个问题有更好的设计吗?
  3. 感谢。

1 个答案:

答案 0 :(得分:4)

我想这完全没问题,因为你并没有真正实现一个伴侣对象。

如果您是,您可以访问immutable.Vector内的object A的私人字段(例如private var dirty),这是您没有的。

因此,尽管有些感觉A是一个伴侣对象,但它确实不是。

如果可以通过使用类型别名为任何类型创建伴随对象,则会使成员可见性约束失败(除了private|protected[this]之外)。

此外,像对象类型一样命名对象可以澄清对象的上下文和目的,这在我的书中是 plus

将它们全部放在一个文件中就像我所知的那样在scala中非常常见(例如,在使用类型类模式时)。

因此: 我知道没有陷阱。 并且,imho,不需要采用不同的方法。