Archive

Posts Tagged ‘java’

Переопределение методов equals() и hashCode() в Groovy

Апрель 21, 2010 1 комментарий

Groovy реально позволяет избавиться от поносамногословия Java. Но вчера столкнулся с необходимостью переопределения всем хорошо известных методов equals() и hashCode(). Оказывается, Groovy не упрощает жизнь в этом вопросе. Но у меня не возникло ровно никакого желания писать такую простыню, использовать же попахивающую тухлецом библиотеку Jakarta Commons Lang тоже не было никакого желания.

Что же остается делать? Ну, можно использовать появившийся в версии Groovy 1.6 макрос @Immutable. Но невозможность переопределения конструктора и вообще достаточно сильные накладываемые ограничения на класс не позволили мне этого сделать.

Ок, пошел посмотрел как обстоят дела у наших соседей — языка Ruby, ведь не секрет что очень много в Groovy стырино именно оттуда, а Ruby в свое время скоммуниздил все что надо из Smalltalk. В итоге, как и ожидалось, у Ruby таких проблем в принципе нет и все ограничивается чем-то наподобии:

def ==(other)
  @suit == other.suit and @kind == other.kind
end

Видимо карма такая у Java — все усложнять и там где уместна одна строчка, должно быть десять и непременно парочка XML-файлов конфигурации, чтобы не расслаблялись =)

В общем решил забить и на Java с ее гуру Джошуа Блохом и написать по аналогии как это делается в Ruby:

enum CurrencyCode {
 USD('$'), EUR('€'), CNY('¥')

 char symbol

 CurrencyCode(symbol) {
   this.symbol = symbol
 }
}

class CurrencyRate implements Comparable<CurrencyRate> {
 def code, value

 CurrencyRate(aCode, aValue) {
   (code, value) = [aCode, aValue]
 }

 int compareTo(CurrencyRate rate) {
   this.code <=> rate.code ?: this.value <=> rate.value
 }

 int hashCode() {
   31 * (code?.hashCode()?: 0) + (value?.hashCode()?: 0)
 }

 boolean equals(obj) {
   obj in CurrencyRate && code == obj.code && value == obj.value
 }

 String toString() {
   String.format "1%c = %.4f р.", code.symbol, value
 }
}

Возможно, этот код нарушит какую-то из непреложных заповедей Джошуа, а может и несколько, зато я получил то, ради чего и начал использовать Groovy — гибкость и лаконичность кода!

Рубрики:programming Метки: , ,