2015-12-13 3 views

ответ

5

Да, это правильно. Однако вы должны также переопределить метод hashCode для отражения равенства. То есть, если у вас есть два экземпляра a и b, где a == b, вы должны убедиться, что a.hashCode == b.hashCode.

Самый простой способ достижения двух заключается в использовании кейс-класс:

case class A(private val x: Int, private val s: String) 

Это дает вам исправить equals и hashCode для «бесплатно».


Если вы планируете возможность того, что существуют подклассы A, вы можете посмотреть на Одерски-х idea of canEqual (также here).

+0

Спасибо за ваш ответ! – Finkelson

0

более подходящий подход определяет объект сопутствующего объекта A a Ordering [A].

object A{ 
    implicit object aOrdering extends Ordering[A]{ 
     override def compare(x:A,y:A):Int = ...... 
    } 
} 

чем на вас равно метод, вы должны написать:

override def equals(that: Any) = that match { 
    case a: A => { 
     val ordering = implicitly[Ordering[A]] 
     ordering.compare(this,a) == 0 
} 
    case _ => false 
} 

таким образом, вы можете повторно использовать код коллекции SCALA то есть и другие места, которые вам нужно для заказа для данного класса.

+0

Почему бы просто не написать его обычным способом и использовать метод 'equals' класса в методе' compare'? Вы должны написать определение равенства в одном или другом месте. Для классов, которые не имеют логического упорядочения, вы не можете использовать объект 'Ordering', поэтому было бы более последовательным, чтобы писать его обычным способом везде. Я не вижу никаких преимуществ на вашем пути, и это кажется более сложным и непоследовательным. Что мне не хватает? –

+0

, если у вас нет заказа, его право только переопределить equals(). , если у вас есть заказ, у вас есть повторяющийся код, а это значит, что вам нужно поддерживать оба из них. –

+0

Почему, где дубликат кода? Ваш метод 'compare' должен использовать метод' equals', определенный классом, чтобы определить, когда выплевывать 0. Нет дублирования. –

Смежные вопросы