У меня есть несколько классов с полями, которые должны быть нечувствительными к регистру, и я хотел бы поместить экземпляры этих классов в HashMaps и искать их по строковому регистронезависимому.
Вместо использования 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)
}
Кто-нибудь может предложить более чистый или лучший подход?
Один недостаток, с которым я столкнулся, заключается в использовании asitEquals от junit, например:
assertEquals("someString", instance.aCaseInsensitiveString)
Сбой, говоря, что ожидал "someString", но получил CaseInsensitiveString <"someString">.
Если я переверну порядок переменных в assertEquals, то это сработает, вероятно, потому, что он затем вызывает функцию equals в классе CaseInsensitiveString. В настоящее время я работаю над этим, сохраняя порядок таким же (так что ожидаемый - фактически ожидаемый), но вызываю .toString для CaseInsensitiveString:
assertEquals("someString", instance.aCaseInsensitiveString.toString)
Это тоже работает:
assertEquals(CaseInsensitiveString("someString"), instance.aCaseInsensitiveString)
Могу ли я добавить неявное равенство в String для решения этой проблемы?