2015-08-23 5 views
-3

У меня возникли проблемы с пониманием этого кода. Я знаю, что мне нужно создать метод сравнения не встроенных модулей, но кто-то может объяснить мне, подробно, что делает boolean equals()?. Методequals() в объектах Java

public class Book { 

    private String title; 
    private Author author; 
    private int year; 
    public boolean equals(Object o) { 
     if (o == this) { return true; } 
     if (o == null) { return false;} 
     if (!o.getClass().equals(Book.class)) {return false; } 
     Book aBook = (Book) o; 
     return aBook.year == year && aBook.title.equals(title) && aBook.author.equals(author); 
    } 
} 

Это было дано мне другом, если у вас есть предложения по улучшению, пожалуйста, скажите мне.

+6

@ sᴜʀᴇsʜᴀᴛᴛᴀ No. Это [вне темы] (http://codereview.stackexchange.com/help/on-topic) в обзоре кода на нескольких уровнях. – Mast

+0

@ Маст: Я не уверен, что это по теме. Независимо от того, подобные вещи можно найти в большинстве учебных пособий по Java или в обычном поиске Google (https://www.google.com/?gws_rd=ssl#q=java+equals+method+implementation) (первая пара хитов должно быть адекватным). Не знаю, почему этот вопрос повторно запрашивает материал, который был задан много раз на этом и других сайтах. –

ответ

1

Проверьте свои комментарии в коде: -

public boolean equals(Object o) { 
     //below line is comparing if o refers to the same current object 
     if (o == this) { return true; } 
     //below line is checking if o is null, in that case it will return false 
     if (o == null) { return false;} 
     //checking if the class of o is Book, if not return false 
     if (!o.getClass().equals(Book.class)) {return false; } 
     //Casting the o from Object to Book class 
     Book aBook = (Book) o; 
     //comparing the book object's year. title and author, if all three are equal then only two Book objects are equal 
     return aBook.year == year && aBook.title.equals(title) && aBook.author.equals(author); 
    } 

Вы позвонит вышеупомянутый метод, как показано ниже: -

Book object1=new Book(); 
Book object2=new Book(); 
object1.equals(object2); 

Сценарий 1: -Первый линия в чеках кода, будь object1 и объект2 относятся к одному и тому же объекту: -

Book object1=new Book(); 
Book object2=object1; 
object1.equals(object2); 

Над ситуацией обрабатывается в ваших пихтах t, вы можете видеть в сценарии 1, object2 - это в основном тот же текущий объект, который является объектом1.

Вашего нуля и класс условия можно записать как: -

if((o == null) || (o.getClass() != this.getClass())) return false; //preferred 

Не получить соблазн использовать: -

if(!(o instanceof Book)) return false; //avoid 

потому что сформулированное условие не возвращает ложь, если аргумент является подкласс классовой книги.

В последней части вашего метода equals вы просто сравниваете три атрибута двух объектов Book и называете два объекта равными, только если все три атрибута равны.

+1

Я думаю, что Null Check действительно не требуется, 'o instanceof Book.class' будет достаточно! –

+0

@NeerajJain Посмотрите на код еще раз. Это * не * выполнение 'instanceof'. – Andreas

+0

@ Аndreas, это было всего лишь предложение, не было нигде, хотя ... Я думал, что было бы лучше улучшить одобренное решение. –

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