2016-08-01 1 views
1

Предположим, что у меня есть класс , который имеет поле private final int age и метод public Dog ageBy(Time time), который возвращает новый экземпляр собаки каждый раз при вызове. A Dog класс не просто неизменен, но не имеет никаких методов, чтобы вернуть его возраст, другими словами договор собаки не позволяет ему сказать свой возраст (почему? Потому что нет разговорных собак), он может только «лаять» «спать» и делать другие вещи собаки.Как реализовать равные без полей экспонирования?

Но Dog можно сравнить с другими собаками по возрасту. Для этого мне нужно переопределить метод public equals(Object o) в классе Dog. Но проблема в том, что нет способа сравнить это, потому что я не могу получить доступ к прошедшему возрасту собак.

Вопрос: Как реализовать метод equals без отображения каких-либо полей объекта?

+3

Все экземпляры 'Dog' имеют доступ к' private' полей других 'экземпляров Dog'. – resueman

+0

Спасибо, я не знал этого :) –

ответ

5

Любой метод может получить доступ к полям private одного и того же класса, поэтому вы можете написать равным, обращаясь непосредственно к полям, без потребностей геттеров.

Вот пример:

public class Point { 
    private int x; 
    private int y; 

    public Point (int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    public boolean equals(Object obj) { 
     // Test for null, and type 
     ... 
     Point p = (Point) obj; 
     return x == p.x && y == p.y; 
    } 
2

Объект может получить доступ к private экземплярам другого объекта того же класса, поэтому вам не нужны геттеры в equals.