【问题标题】:Scala type alias with companion object带有伴随对象的 Scala 类型别名
【发布时间】:2015-08-29 13:03:52
【问题描述】:

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

我有几个类都表示为固定长度的 Vector[Byte](最终它们用于需要字节字符串的学习算法中),例如 A、B 和 C。 为了便于阅读,我希望在包的其他地方将这些类称为 A、B 和 C,并且我不需要为这些方法向 Vector 添加任何额外的类方法。因此,我认为扩展我的库模式在这里没有用。 但是,我想包含 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. 对于这个问题有更好的设计吗?

谢谢。

【问题讨论】:

    标签: scala vector companion-object type-alias


    【解决方案1】:

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

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

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

    如果可以使用类型别名为任何类型创建伴随对象,那么成员可见性约束将变得毫无意义(private|protected[this] 可能除外)。

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

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

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

    【讨论】:

    • 在处理类型 A 的参数时,在此对象 (A) 中定义的隐式不会进入范围。例如在 spray-json 中的 jsonFormat() 的情况下。
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多