2013-08-16 3 views
2

Что такое meaing из ниже линии Java кодаЯ хочу знать значение строки в Java

class Dog { 
    int size; 

    Dog(int size) { 
     this.size = size; 
    } 

    public boolean equals(Object o) { 
     return this.size == ((Dog) o).size; // im not getting whats the meaning of this line 
    } 
} 

Я хочу знать смысл следующей строки:

return this.size== ((Dog)o).size; 
+0

return this.size == ((Dog) o) .size; // im не получает, что означает менинги этой строки}} –

+2

линяет объект o на Собаку и получает размер – orangegoat

+0

благодаря его downcasting ryt ?? –

ответ

2

Это нечетная реализация метода equals.

Объект o и попытаться передать его объекту Dog. Затем он сравнит размер этой собаки с размером собаки .

Это проблематичный метод, поскольку, если мы должны передать что-то, что нельзя отнести к собаке (например, к сокету), это вызовет исключение ClassCastException, которое является большим no-no с equals(. Он должен вернуть false, если объекты не могут быть выбраны для сравнения.

Я бы переписать его следующим образом:

boolean equals(Object o){ 
    if(o==null) return false; 
    if(this==o) return true; 
    if(!o instanceOf Dog) return false; 
    return this.size==((Dog) o).size; 
} 
+0

Он также не проверяет значение null. –

+0

@Robadob Извините, исправлено. – hexafraction

+1

Я думаю, что ваш код уже проверяет значение null (до редактирования). 'o instanceOf Dog' => если' o' является null => 'null instanceof Dog' => false ...'! null' является проблемой и может быть исправлено с помощью '! (o instanceOf Dog)' –

1
((Dog)o).size 

(Dog)o // means Cast o into Dog. 


this.size = castedDog.size //means assign the `size` of current object the same value as casteddog object's size 
3

Это значение: size переменная текущего объекта сравнивается на равенство с size переменной другого объекта. Результат, значение boolean, возвращается в результате метода equals.

Неявное утверждение заключается в том, что другой объект имеет тот же тип. Правильная реализация equals должна не выбросить ClassCastException в этом случае, а скорее вернуть false. Поэтому эта реализация не соответствует договору метода Object#equals.

Мне кажется, что разработчик чувствовал себя умным и «узнал» способ лаконично реализовать equals. Корректная, но все же достаточно краткая, реализация будет идти, как это:

return o instanceof Dog && ((Dog)o).size == this.size; 
0

заливки объекта о к Dog и получить размер object. И ((Dog)o).size вернется int размер.

1

1) это будет отбрасывать Объекта о собаке класса , если прохождение кроме объекта Dog, то он будет бросать Обсадные Exceptioin

2), то он сравнивает атрибут вывода текущего атрибута - размер , то это будет return boolean value

0

Предположим, у вас есть две собаки: dog1 и dog2, и, допустим, вы вызываете dog1.equals (dog2).

this.size, на английском языке будет переводить: «размер этой собаки»

==, на английском языке будет переводить на: «имеет такое же значение, как»

((собака) о).размер, на английском языке переводится на: «размер o, а o - собака»

Составлено вместе: Размер этой собаки имеет то же значение, что и размер o, а o - собака.

Поскольку вы звоните dog1.equals (dog2), то «эта собака» относится к dog1, и «о» относится к dog2, давая вам:

Размер dog1 имеет то же значение, что и размер собаки2, а собака2 - собака.

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