2016-08-01 4 views
1

Nehmen wir an, ich habe eine Dog Klasse, die ein Feld private final int age und eine Methode public Dog ageBy(Time time) hat, die jedes Mal neue Instanz des Hundes zurückgibt. A Dog Klasse ist nicht nur unveränderlich, hat aber keine get Methoden, um sein Alter zurückzugeben, in anderen Worten Hund Vertrag erlaubt es ihm nicht zu sagen, sein Alter (warum? Denn es gibt keine sprechenden Hunde), er kann nur "bellen ',' schlaf 'und mache die Sachen anderer Hunde.Wie implementiert man gleich, ohne die Felder zu exponieren?

Aber Dog kann mit anderen Hunden nach Alter verglichen werden. Um dies zu tun, muss ich public equals(Object o) Methode in Dog Klasse überschreiben. Aber das Problem ist, dass es keine Möglichkeit gibt, es zu vergleichen, weil ich nicht auf passierte Hunde zugreifen kann.

Frage: Wie man Equals-Methode implementieren, ohne irgendwelche Felder des Objekts auszusetzen?

+3

Alle 'dog' Instanzen haben Zugriff auf die' private' Felder anderer 'dog' Instanzen. – resueman

+0

Danke, das wusste ich nicht :) –

Antwort

5

Jede Methode kann auf private Felder der gleichen Klasse zugreifen, so dass Sie den Gleichheitszugriff direkt auf die Felder schreiben können, ohne dass Getter benötigt werden. Hier

ein Beispiel:

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

Ein Objekt kann auf private Instanzen eines anderen Objekts derselben Klasse zugreifen, sodass Sie in equals keine Getter benötigen.

Verwandte Themen