我想将常用字符串存储在一个对象中。最重要的是,我还想方便地添加一个类似于mkString函数的功能,如果有两个特定类型的对象,则可以在它们后面附加一个特定字符或一组字符。
这是我到目前为止所拥有的:
import org.scalatest._
class MyKey(val inputValue: String) {
val value = inputValue
def + (otherMyKeys: MyKey): MyKey = {
new MyKey(this.value + "." + otherMyKeys.value)
}
override def toString(): String = this.value.toString
}
object MyKeys {
val SPARK = new MyKey("spark")
val JSON = new MyKey("json")
val TITLE = new MyKey("title")
val URI = new MyKey("uri")
}
class MyKeySpec extends FlatSpec with Matchers {
"MyKey" should "not put a fullstop character when there is only one value" in {
MyKeys.SPARK should not equal("spark")
MyKeys.SPARK.toString() should equal("spark")
}
it should "put a fullstop character between multiple keys" in {
val actual = MyKeys.SPARK + MyKeys.JSON + MyKeys.TITLE + MyKeys.URI
val expected = "spark.json.title.uri"
actual should not equal(expected)
actual.toString() should equal(expected)
}
it should "work even when the same key is repeated multiple times" in {
val actual = MyKeys.SPARK + MyKeys.SPARK + MyKeys.SPARK
val expected = "spark.spark.spark"
actual should not equal(expected)
actual.toString() should equal(expected)
}
}
该解决方案在使用“ +”函数时非常出色,但如果没有toString则无法使用。有没有一个甚至不需要使用toString函数的更优雅的解决方案?目的是将类似“ spark.json.spark.spark”的字符串设置为MyKeys.SPARK + MyKey.JSON + MyKey.SPARK + MyKey.SPARK
我可以使用mkString函数执行相同的操作,但是我觉得这不是超级直观。我该如何实现?
答案 0 :(得分:2)
您可能要做的一件事是定义一个apply()
方法,而不是覆盖toString()
。
def apply(): String = this.value
那你得到...
MyKeys.SPARK should not equal("spark")
MyKeys.SPARK() should equal("spark")
...等等
设计的问题是,MyKey
类型的任何东西显然都不是String
。它几乎是String
的一个,但仍然需要一些催化剂来进行过渡,例如.toString()
或我建议的隐藏。apply()
方法。 / p>
您可以将MyKeys.SPARK
设为真实的String
,但是+
的{{1}}方法已经具有含义,无法重新定义。如果您确定使用其他运算符可以,那么可以这样做。
String
答案 1 :(得分:0)
您是否考虑过为此使用隐式转换?
class MyKey(val value: String) {
def + (otherMyKeys: MyKey): MyKey = {
new MyKey(this.value + "." + otherMyKeys.value)
}
}
object MyKey {
implicit def myKeyToString(myKey: MyKey): String = myKey.value
}
object MyKeys {
val SPARK = new MyKey("spark")
val JSON = new MyKey("json")
}
val result: String = MyKeys.SPARK + MyKeys.JSON // spark.json