Bin etwas unsicher bezüglich Implementierung von equals und compareTo in einer Vater-Kind-Klassenhierarchie. Wäre froh, wenn mir jemand helfen würde.
Klasse Figur:
Und die Klasse Body:
Frage 1:
Das Prüfen nach Gleichheit wird in beiden Methoden unterschiedlich implementiert: in der Methode equals wird nur die Instanzvariable id geprüft, während in der Methode compareTo andere Attribute (laenge & breite bzw. laenge, breite und hoehe) berücksichtigt werden. Wird so etwas (wenn auch nur in seltenen Situationen) praktiziert? Gebe es sonst ein gutes Beispiel, in dem eine solche (unterschiedliche) Implementierung sinnvol eingesetzt wird?
Frage 2:
Die Implementierung der Methode compareTo in der Unterklasse Body ist syntaktisch korrekt (semantisch glaube auch). Nun, macht man das so? Oder, gebe es andere Möglichkeiten, die evtl. besser sind?
Frage 3:
Anstatt
könnte man auch den Operator instance of einsetzen:
Wo liegt der Unterschied? Ist die getClass-Variante effizienter? Den, in vielen Tutorials wird diese Variante eingesetzt. Was ist der Grund dafür?
Frage 4:
Folgende Zeile interessiert mich noch:
Gehe ich richtig in der Annahme, dass final nur dann nötig ist, wenn die Gefahr besteht, dass das übergebene Objekt geändert wird, bevor die Methode equals abgearbeitet wird? Wenn diese Gefahr nicht besteht, könnte man auf final auch verzichten, wie dies in der folgenden Zeile der Fall ist:
Oder, ist dies doch anders?
Hinweis:
Die Methode hashCode habe ich hier bewust nicht überschrieben bzw. rausgelassen, obwohl die Methode equals überschrieben wurde.
Danke
Klasse Figur:
Java:
public class Figur implements Comparable<Figur>
{
private int id;
private int laenge;
private int breite;
// ...
public boolean equals(Object obj)
{
if (this == obj)
return true;
else if (obj == null)
{
return false;
}
else
{
final Figur f = (Figur)obj;
return id == f.id;
}
}
public int compareTo(Figur figur)
{
if (this == figur)
{
return 0;
}
else if (figur.getClass() != getClass())
{
throw new ClassCastException();
}
else
{
if (laenge == figur.laenge)
{
return breite - figur.breite;
}
else
{
return laenge - figur.laenge;
}
}
}
}
Und die Klasse Body:
Java:
public class Body extends Figur
{
private int hoehe;
// ...
public int compareTo(Figur figur)
{
if (this == figur)
{
return 0;
}
else if (figur.getClass() != getClass())
{
throw new ClassCastException();
}
else
{
Body b = (Body)figur;
if (super.compareTo(figur) == 0)
{
return hoehe - b.hoehe;
}
else
{
return super.compareTo(figur);
}
}
}
}
Frage 1:
Das Prüfen nach Gleichheit wird in beiden Methoden unterschiedlich implementiert: in der Methode equals wird nur die Instanzvariable id geprüft, während in der Methode compareTo andere Attribute (laenge & breite bzw. laenge, breite und hoehe) berücksichtigt werden. Wird so etwas (wenn auch nur in seltenen Situationen) praktiziert? Gebe es sonst ein gutes Beispiel, in dem eine solche (unterschiedliche) Implementierung sinnvol eingesetzt wird?
Frage 2:
Die Implementierung der Methode compareTo in der Unterklasse Body ist syntaktisch korrekt (semantisch glaube auch). Nun, macht man das so? Oder, gebe es andere Möglichkeiten, die evtl. besser sind?
Frage 3:
Anstatt
Java:
if (figur.getClass() != getClass())
Java:
iif (!(figur instanceof Body))
Wo liegt der Unterschied? Ist die getClass-Variante effizienter? Den, in vielen Tutorials wird diese Variante eingesetzt. Was ist der Grund dafür?
Frage 4:
Folgende Zeile interessiert mich noch:
Java:
final Figur f = (Figur)obj;
Gehe ich richtig in der Annahme, dass final nur dann nötig ist, wenn die Gefahr besteht, dass das übergebene Objekt geändert wird, bevor die Methode equals abgearbeitet wird? Wenn diese Gefahr nicht besteht, könnte man auf final auch verzichten, wie dies in der folgenden Zeile der Fall ist:
Java:
Body b = (Body)figur;
Oder, ist dies doch anders?
Hinweis:
Die Methode hashCode habe ich hier bewust nicht überschrieben bzw. rausgelassen, obwohl die Methode equals überschrieben wurde.
Danke