我想要一个对象类型,该对象类型在概念上包括三部分信息:
一个字符串
将字符串映射到字符串的字典(Scala地图)
可以是“单词”或“标点符号”的类型
尽可能重要的是,该对象类型应被认为是持有文本文档内容的基础-通过具有实例的可迭代性。
我目前正在将其实现为类层次结构,其中有一个包含1和2的第一个类,然后有两个继承它的类,一个称为“单词”,另一个称为“标点符号”,如下所示:
abstract class TextElement(initContent: String, initStyleMap: Map[String, String]) { val content : String = initContent val styleMap: Map[String, String] = initStyleMap } case class Word(initContent: String, initStyleMap: Map[String, String]) extends TextElement(initContent: String, initStyleMap: Map[String, String]) { } case class Punctuation(initContent: String, initStyleMap: Map[String, String]) extends TextElement(initContent: String, initStyleMap: Map[String, String]) { }
我想知道是否有比我刚刚描述的第一个直觉更合适的方法,因为Scala中可能有更精简的方法。
值得注意的是,我将拥有这些对象的数千个实例,因此内存占用空间以及快速访问数据非常重要。我的幼稚实现感觉有点样板,也许还有其他方法被我忽略了。
因此,我想知道是否有一种可行的方法与这种直观的方法不同,可能会带来任何好处。同样,是否可以使以上代码更简洁/简洁。
您可以使用trait
代替抽象类来减少代码量:
sealed trait TextElement { def content: String def styleMap: Map[String, String] } case class Word(content: String, styleMap: Map[String, String]) extends TextElement case class Punctuation(content: String, styleMap: Map[String, String]) extends TextElement
sealed
关键字允许编译器检查匹配是否详尽。