我有许多带有字段的类,这些字段应该是不区分大小写的,并且我想将这些类的实例放入HashMap中,并通过不区分大小写的字符串查找它们。
与其每次想要按其字符串索引实例或按其字符串查找实例时都使用toLowerCase,我尝试将此逻辑封装在CaseInsensitiveString类中:
/** Used to enable us to easily index objects by string, case insensitive
*
* Note: this class preservse the case of your string!
*/
class CaseInsensitiveString ( val _value : String ) {
override def hashCode = _value.toLowerCase.hashCode
override def equals(that : Any) = that match {
case other : CaseInsensitiveString => other._value.toLowerCase ==_value.toLowerCase
case other : String => other.toLowerCase == _value.toLowerCase
case _ => false
}
override def toString = _value
}
object CaseInsensitiveString {
implicit def CaseInsensitiveString2String(l : CaseInsensitiveString) : String = if ( l ==null ) null else l._value
implicit def StringToCaseInsensitiveString(s : String) : CaseInsensitiveString = new CaseInsensitiveString(s)
def apply( value : String ) = new CaseInsensitiveString(value)
def unapply( l : CaseInsensitiveString) = Some(l._value)
}
你能提出更清晰或更好的方法吗?
我遇到的一个缺点是当使用junit的assertEquals时,像这样:
assertEquals("someString", instance.aCaseInsensitiveString)
它失败了,说它期望得到"someString",但实际上得到了CaseInsensitiveString<"someString">。
如果我反转assertEquals中变量的顺序,那么它就可以工作了,可能是因为这样它会调用CaseInsensitiveString类中的equals函数。我目前通过保持顺序相同(所以预期的实际上是预期的)但在CaseInsensitiveString上调用.toString来解决这个问题:
assertEquals("someString", instance.aCaseInsensitiveString.toString)
这也可以工作:
assertEquals(CaseInsensitiveString("someString"), instance.aCaseInsensitiveString)
我可以添加一个隐式的字符串相等方法来解决这个问题吗?