equals - Identität ändern bei Vererbung?

Shiwayari

Mitglied
Bin gerade auf ein kleines (?) Designproblem gestoßen:

Ich habe Entry Objekte, die in einem Set gelagert werden, und deren equals/hashCode Methoden so überschrieben sind, dass die Identität nur vom Attribut name abhängt.

Weiter habe ich Objekte TitledEntry, die das gleiche sind wie ein Entry, zusätzlich aber ein Attribut title und zugehörige Methoden haben.

Nun soll aber ein beliebiges Entry Objekt ungleich eines beliebigen TitledEntry Objekts sein; der Titel ändert also die Identität des Entry's.



Da ich ein TitledEntry genauso benutzen will, wie ein Entry, macht erben von Entry eigentlich Sinn..
In TitledEntry überschreibe ich dann die equals/hashCode Methoden so, dass sie Name und Titel
miteinbeziehen...

Und dann bekomme ich sowas:

Java:
Entry e = new Entry("Name");
TitledEntry t = new TitledEntry("Name", "Title");

//Soll beides false ergeben:
e.equals(t) // ergibt true
t.equals(e) // ergibt false

Und das is ja vollkommen wirr.


Ich könnte folgendes machen:

Entweder
1) Ich überprüfe in der equals Methode der Entry Klasse, ob das übergebe Objekt ein Entry oder ein TitledEntry ist.

Oder
2) Ich lasse TitledEntry nicht von Entry erben, sondern erstelle in TitledEntry ein Attribut vom Typ Entry; und leite dann alle Methoden auf das Attribut um..


Beides blöd =/
Bei 1) muss die Oberklasse von der Unterklasse wissen, was nicht sonderlich sinnvoll ist, dann kann ich auch gleich das Attribut title in die Oberklasse reinnehmen.

Und 2) ist wie ich finde sehr umständlich und unsauber.


Im Prinzip könnte ich schon das zusätzliche Attribut title mit in die Oberklasse schreiben, aber was ist wenn ich nicht nur 1 Attribut hinzufügen will, sondern ganz viele?
Dann habe ich in der Oberklasse etliche Attribute, die nie benutzt werden, das will ja auch niemand.


Bessere Lösungsvorschläge?
 
G

Gonzo17

Gast
Ich hab das mal testweise selbst ausprobiert und keine Probleme gehabt.

Edit: Quatsch erzähl ich. Hab das selbe Problem. :)

Edit2: Machst du die Überprüfung in der equals-Methode mit einem instanceof? Dann ist es klar, dass da im ersten Fall true kommt. Stattdessen könntest du direkt überprüfen, ob das Objekt mit dem verglichen wird, auch tatsächlich vom gleiche Typ ist. Meine Klasse heißt hier TestObject:

Java:
@Override
	public boolean equals(Object arg0) {
		if (arg0.getClass().equals(this.getClass()))
			return ((TestObject) arg0).name.equals(name);
		return false;
	}
 
Zuletzt bearbeitet von einem Moderator:

xehpuk

Top Contributor
Übrigens: Eclipse hat dazu schon einen guten Mechanismus.
Code:
Source > Generate hashCode() and equals()... > "Use 'instanceof' to compare types" deaktivieren

Ergibt bei mir (hashCode() mal weggelassen):
Java:
public class Entry {
	private final String name;

	public Entry(final String name) {
		this.name = name;
	}

	public final String getName() {
		return name;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Entry other = (Entry) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
Java:
public class TitledEntry extends Entry {
	private final String title;

	public TitledEntry(final String name, final String title) {
		super(name);
		this.title = title;
	}

	public final String getTitle() {
		return title;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		TitledEntry other = (TitledEntry) obj;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}

	public static void main(String[] args) {
		final Entry e = new Entry("Name");
		final TitledEntry t = new TitledEntry("Name", "Title");

		// Soll beides false ergeben:
		System.out.println(e.equals(t)); // ergibt false
		System.out.println(t.equals(e)); // ergibt false
	}
}

PS: Ich finde deinen zweiten Ansatz (Entry als Instanzvariable von TitledEntry) gar nicht so verkehrt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
P Strings: equals vs == Allgemeine Java-Themen 47
F Methoden hashCode() & equals() Allgemeine Java-Themen 13
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
J Probleme mit CodeCoverage und Lombok Equals Allgemeine Java-Themen 1
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
T Zwei Wortendungen vergleichen ohne .equals Allgemeine Java-Themen 10
C Object.equals() liefert falschen Wert? Allgemeine Java-Themen 14
T Collections TreeSet.contains ruft nicht .equals? Allgemeine Java-Themen 4
H Problem mit der .equals()-Methode Allgemeine Java-Themen 2
T Compiler-Fehler not equals Allgemeine Java-Themen 22
I HashMap key wird nicht erkannt trotz überschriebener equals/hashCode Methode Allgemeine Java-Themen 6
V ArrayList vergleichen mit .equals? Allgemeine Java-Themen 13
A mit .equals Array befüllen schlägt teilweise fehl Allgemeine Java-Themen 3
G Probleme mit equals Allgemeine Java-Themen 3
R Merkwürdiges Verhalten der equals Method Allgemeine Java-Themen 4
tuttle64 equals() und == Allgemeine Java-Themen 4
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
H double dispatch und equals(Object) Allgemeine Java-Themen 6
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
J Best Practice für implementierung von equals(...) Allgemeine Java-Themen 7
M equals & compareTo Allgemeine Java-Themen 15
M Warum Strings mit equals vergleichen... Allgemeine Java-Themen 6
T Wie intelligent ist dieses überschriebene .equals() ? Allgemeine Java-Themen 13
G Objektvergleich mit equals Allgemeine Java-Themen 5
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
M String#equals(), Probleme mit großen Strings? Allgemeine Java-Themen 4
André Uhres equals überschreiben Allgemeine Java-Themen 31
F Problem: mehrere Interfaces definieren equals() neu Allgemeine Java-Themen 24
A equals() macht nicht, was es soll Allgemeine Java-Themen 4
B Equals Methode überschreiben mit Array Allgemeine Java-Themen 2
M equals() != compareTo() ? Allgemeine Java-Themen 3
M String mit equals() vergleichen - Frage Allgemeine Java-Themen 3
S equals überladen Allgemeine Java-Themen 15
S Mal was allgemeines zu equals() Allgemeine Java-Themen 12
J Arrays vergleichen mit equals Allgemeine Java-Themen 8
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
Z Java Testklassenvariable ändern im Hauptprogramm Allgemeine Java-Themen 5
L Uhrzeit von 24-Uhr zu 12-Uhr ändern Allgemeine Java-Themen 2
Thallius Zeitzone zu einem LocalDate hinzufügen aber ohne es zu ändern... Allgemeine Java-Themen 2
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
W Classpath Reflexion - Prüfen ob man auf ein Feld ändern kann Allgemeine Java-Themen 2
J Jasper Reports - Subreport zur Laufzeit ändern Allgemeine Java-Themen 6
N Variablen Array Länge ändern. Allgemeine Java-Themen 8
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
R Was muss ich ändern, damit der Kreis links unten gezeichnet wird? Allgemeine Java-Themen 17
L Hintergrundfarbe jedes spinner-Elements ändern Allgemeine Java-Themen 1
Q Eclipse Escape Sequenzen Farbe ändern Allgemeine Java-Themen 4
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
D ArrayList Indexlänge ändern Allgemeine Java-Themen 2
E javax.mail sene Type ändern Allgemeine Java-Themen 2
J Farbe von Buttons mehrmals ändern Allgemeine Java-Themen 5
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
B ImageView Farbe ändern Allgemeine Java-Themen 3
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
T ändern neue Java Versionen was an der Programmiersprache? Allgemeine Java-Themen 15
R Zeitformat ändern Allgemeine Java-Themen 18
olfibits Erste Schritte Konsolentitel ändern Allgemeine Java-Themen 3
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
S Kann man mit Java auf einem lokalen PC/Mac Benutzergruppen auslesen und Rechte ändern? Allgemeine Java-Themen 11
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
B Input/Output Datei ändern Allgemeine Java-Themen 9
T JasperReport Hintergrundfarbe wertabhängig ändern Allgemeine Java-Themen 3
sandaime CMD aufrufen und aktuellen pfad ändern Allgemeine Java-Themen 11
M Variable ändern bei jedem Schleifendurchlauf Allgemeine Java-Themen 32
RalleYTN DPI eines Bildes ändern Allgemeine Java-Themen 4
K eclipse Workspace ändern Allgemeine Java-Themen 2
J Properties file ändern Allgemeine Java-Themen 12
R WebDriver Firefox preferences ändern Allgemeine Java-Themen 0
W Input/Output Kann .properties Datei in kompilierter .jar nicht ändern Allgemeine Java-Themen 2
G Unix Passwort mit Java ändern? Allgemeine Java-Themen 3
M OOP Bildschirmauflösung des Systems ändern Allgemeine Java-Themen 0
Avarion Font von StyledDocument ändern Allgemeine Java-Themen 0
chuxXo System/JLayer Volume ändern Allgemeine Java-Themen 0
Thallius App-Sprache in der App ändern. Wo ist mein Denkfehler? Allgemeine Java-Themen 6
Tausendsassa Interface Buttons Background ändern! Wie?? Allgemeine Java-Themen 10
E Apache POI Powerpoint Verlinkungen ändern Allgemeine Java-Themen 4
R Int Wert im Dialogfeld ändern Allgemeine Java-Themen 4
Ananaskirsche Best Practice Sprachen ändern für Consolenausgaben Allgemeine Java-Themen 2
P Sprache ändern ins Programm einbinden Allgemeine Java-Themen 6
M String an einem abschnitt ändern Allgemeine Java-Themen 14
S Name einer Musikdatei auslesen und ändern Allgemeine Java-Themen 8
M Threads Bildformat mit java ändern Allgemeine Java-Themen 2
x22 Hintergrund in Netbeans ändern Allgemeine Java-Themen 3
M Zufälligen String generieren und alle 5 Minuten ändern Allgemeine Java-Themen 2
C Input/Output Bestimmte Zeile in Datei ändern. Allgemeine Java-Themen 13
B Swing Look And Feel ändern Allgemeine Java-Themen 15
jstei001 Reguläre Ausdrücke bearbeiten/ändern Allgemeine Java-Themen 14
H CLASSPATH im Javaprogramm ändern Allgemeine Java-Themen 5
S Datentypen Eine Variable von String zu Int ändern Allgemeine Java-Themen 5
B Input/Output Dateiendung ändern Allgemeine Java-Themen 6
P ganze Zeilen in einem File mit .replace() ändern. Allgemeine Java-Themen 10
Y Bildschirmauflösung ändern Allgemeine Java-Themen 5
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
S Klassen .jar - eine .class datei ändern? Allgemeine Java-Themen 23

Ähnliche Java Themen

Neue Themen


Oben