2014-11-15 4 views
1

Я знаю, что это задано очень много, и я не знаю, понимаю ли я хэш-коды, но это должен быть адрес, и как я могу исправить свой конкретный пример? Если я правильно понимаю, у меня есть двойники в моем классе, но я не могу добавить их в хэш-код, из-заПереопределение HashCode() в Java с двойными значениями

possible loss of precision 
found : double 
required: int 
    return this.area(); 

Вот мой Shape класс:

abstract class Shape implements Comparable<Shape> 
{ 
    abstract double area(); 


    public int compareTo(Shape sh){ 
     return Double.compare(this.area(),sh.area()); 
    } 

    public int hashCode() { 
     return this.area();  
    } 

    public boolean equals(Shape sh) { 
     if (sh instanceof Shape && this.area()==sh.area()) { 
      return true;   
     } else { 
      return false ; 
     } 
    } 
} 

Является area() только значение Мне нужно беспокоиться о: hashCode()?

+0

Поведение hashCode должно соответствовать таковому из равных таким образом, что если два объекта считаются равными с использованием 'equals', то хэш-код из двух объектов должен быть одинаковым. Если вы используете только область фигуры, чтобы определить, равна ли она, вы можете просто вернуть область для хэш-кода. – DanielGibbs

+3

'Shape' - абстрактный класс. Вы хотите, чтобы две формы одной и той же области были равны, даже если они имеют разные формы? – khelwood

ответ

3

Вы можете использовать пример хэш-код в двойном классе:

public int hashCode() { 
    long bits = doubleToLongBits(value); 
    return (int)(bits^(bits >>> 32)); 
} 

Это позволит избежать потери прецизионности, вызванной простое литье double to int.

Если область является единственным свойством, определяющим hashCode, вы можете использовать тот же самый код, заменив value на area.

Однако я не уверен, что area является хорошим кандидатом для вычисления hashCode, поскольку он сам вычисляется из свойств подклассов Shape. Вероятно, вы должны реализовать hashCode в каждом подклассе Shape на основе конкретных свойств этого подкласса.

+0

@ user4254704 Я предполагаю, что область вычисляется с использованием свойств подклассов Shape. См. Мое редактирование. – Eran

+0

@ user4254704 Это статический метод Double Class. Попробуйте Double.doubletolongbits – Eran

+0

Что делать, если у меня есть несколько значений –

1

Не просто добавляйте числа вместе для создания хеш-кода; это, скорее всего, приведет к дублированию хеш-кодов для неравных объектов близко друг к другу. Вместо этого я рекомендую использовать метод Objects.hash из стандартного Java API или более выразительный и эффективный HashCodeBuilder от Apache Commons-Lang. Вы должны включить в расчет hashCode точно те же поля, которые вы используете для определения equals.

Конечно, как @khelwood отметили, вы, скорее всего не хотите реализовать equals и hashCode на этом абстрактном объекте, так как 1x4 прямоугольник и прямоугольник 2х2, вероятно, не равны. Вместо этого, вы можете повторно объявить эти методы как abstract на Shape, чтобы заставить подклассы для их реализации:

public abstract class Shape { 
    @Override 
    public abstract int hashCode(); 
} 
+0

Да, я знаю, что вы говорите, я просто не знаю, как распознать две разные формы: –

+0

@ user4254704 Вам нужно будет выяснить, что это за правила. Большинство объектов равны только другим объектам одного и того же класса. – chrylis

0

Вы можете сделать:

public int hashCode() { 
    return Double.valueOf(this.area()).hashCode(); 
} 

- Издание: исправлена ​​valueOf имя метода. Спасибо @ user4254704.

+1

это дает ошибку –

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