带有伴随对象的 Scala 类型别名

Scala type alias with companion object

我是一个相对较新的 Scala 用户,我想就我的代码的当前设计征求意见。

我有几个 class 都表示为固定长度 Vector[Byte](最终它们用于需要字节字符串的学习算法),比如 A、B 和 C。 为了便于阅读,我希望这些 classes 在包的其他地方被称为 A、B 和 C,并且我不需要为这些方法向 Vector 添加任何额外的 class 方法。因此,我认为 extend-my-library 模式在这里没有用。 但是,我想包括 Vector 附带的所有有用的功能方法,而不必每次都 'drill' 到包装器对象中。由于效率在这里很重要,我也不希望包装器增加重量。

因此我决定在包对象中定义类型别名:

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(...)

我找不到任何特别警告不要为类型别名编写伴生对象,但它似乎违背了类型别名的使用方式。这也意味着所有这三个 class 都在同一个文件中定义,理想情况下它们应该分开。

  1. 这种做法有什么隐藏的问题吗?
  2. 这个问题有更好的设计吗?

谢谢。

我想这完全没问题,因为您并没有真正实现伴生对象。

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

因此,虽然感觉 A 是伴生对象,但实际上不是。

如果可以通过使用类型别名为任何类型创建伴生对象,那么成员可见性约束就没有实际意义了(可能 private|protected[this] 除外)。

此外,像类型别名一样命名对象可以阐明对象的上下文和用途,这在我的书中是 plus

据我所知,将它们全部放在一个文件中是 scala 中很常见的事情(例如,当使用类型 class 模式时)。

因此: 没有陷阱,我知道。 而且,恕我直言,不需要其他方法。