Equals-Methode überschreiben bei composition

Wuast

Bekanntes Mitglied
Hallo Leute,
wenn ich die Equals-Methode überschreibe, muss ich dies in allen Klassen tun wenn ich eine composition habe oder geht das noch einfacher bzw eleganter?

Konkret:

Java:
public class main_class {

    public static void main(String[] args) {
        
        Namensverwaltung namensverwaltungPerson1 = new Namensverwaltung("Herr", (float) 39.5);
        Personen person1 = new Personen ("Hans", "Müller", namensverwaltungPerson1);
        System.out.println(person1);    //toString d. Objektes person1
    
        Namensverwaltung namensverwaltungPerson2 = new Namensverwaltung ("Herr", (float) 32.0);
        Personen person2 = new Personen ("Hans", "Müller", namensverwaltungPerson2);
        
        PersonenAbgleich personenvergleich = new PersonenAbgleich(person1, person2);
        
        System.out.println("Personengleichheit vorhanden: " + personenvergleich.equals(person1, person2));
    }
}



public class Namensverwaltung {

    private String anrede;
    private float arbeitszeit;

    public Namensverwaltung (String anrede, float arbeitszeit) {
        this.anrede = anrede;
        this.arbeitszeit = arbeitszeit;
    }
//eigene Equals-Methode für anrede und arbeitszeit??
}


public class Personen {

    private String vorname;
    private String nachname;
    
    private Namensverwaltung namensverwaltung;
    
    public Personen (String vorname, String nachname, Namensverwaltung namensverwaltung) {
    this.vorname = vorname;
    this.nachname = nachname;
    this.namensverwaltung = namensverwaltung;
    }
    
    public String getVorname() {
        return vorname;
    }
    public String getNachname() {
        return nachname;
    }
}


public class PersonenAbgleich {
    
    private Personen person1;
    private Personen person2;

    PersonenAbgleich (Personen person1, Personen person2) {
        this.person1 = person1;
        this.person2 = person2;
    }
    
    //equals-Methode
    
    @override
    boolean equals(Personen person1, Personen person2) {
        
        //nachfolgende Abfrage scheitert am letzten Teil, wo ich die namensverwaltung direkt ansprechen möchte
        if ( (person1.getVorname()).equals(person2.getVorname()) && (person1.getNachname()).equals(person2.getNachname()) && namensverwaltung.person1().equals(namensverwaltung.person2() ) {
        
        return true;
        }
        else return false;
    }
}

wieder alles einzeln über getter oder geht das auch irgendwie so, wie ich das hier versucht habe anzudeuten? 😀

Danke und schönes Rest-Wochenende
 
Hallo Leute,
wenn ich die Equals-Methode überschreibe, muss ich dies in allen Klassen tun wenn ich eine composition habe oder geht das noch einfacher bzw eleganter?
Die Methode equals soll sicherstellen, dass es sich inhaltlich um das gleiche Objekt handelt.
Im Gegensatz zum Vergleichsoperator (==). Dieser Vergleicht bei primitiven Typen den Wert und bei Objekten die Referenz. Er verglicht im dem Fall also ob es sich um ein und dasselbe Objekt handelt.
--> Wenn Du equals überschreibst sollte bei beinhalteten Objekten immer deren equals Methode verwendet werden. --> Jedes Objekt sollte eine passende Methode, wenn nötig zur Verfügung stellen.
z.B. eine Klasse Person.
Nehmen wir an eine Person ist gleich wenn sie denselben Namen hat und am gleichen Tag geboren ist. Dann könnte man equals in etwa so formulieren.
Code:
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Person {
    public final String firstName;
    public final String lastName;
    private final long birthDay; // Tag in Millisekunden

    public Person(String firstName, String lastName, int day, int month, int year) throws IllegalArgumentException {
        if (firstName == null || lastName == null)
            throw new IllegalArgumentException("Bitte Vor- und Nachname eingeben!");
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthDay = validateDay(day, month, year);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) // dasselbe Objekt
            return true;
        if (o == null || getClass() != o.getClass()) // Parameter null oder anderer Type
            return false;
        Person p = (Person) o; // caste das Objekt auf die benutzt Klasse
        if (birthDay != p.birthDay) // primitiver Datentyp -> benutze !=
            return false;
        if (!firstName.equals(p.firstName)) // String also benutze dessen equals Methode
            return false;
        return lastName.equals(p.lastName);// String also benutze dessen equals Methode
    }

    public String getBirthDay() {
        return new SimpleDateFormat("dd.MM.yyyy").format(new Date(birthDay));
    }

    @Override
    public String toString() {
        return lastName + " " + firstName + ", " + getBirthDay();
    }

    /**
     * Konvertiere Tag, Monat und Jahr in Millisekunden. Prüfe ob es sich um ein
     * gültiges Datum handelt.
     *
     * @param day
     * @param month
     * @param year
     * @return Datum in Millisekunden.
     * @throws IllegalArgumentException
     */
    private long validateDay(int day, int month, int year) throws IllegalArgumentException {
        Calendar c = new GregorianCalendar(year, --month, day);
        if (day != c.get(Calendar.DAY_OF_MONTH) || month != c.get(Calendar.MONTH) || year != c.get(Calendar.YEAR))
            throw new IllegalArgumentException(String.format("%d.%d.%d ist kein gueltiges Datum", day, month, year));
        return c.getTimeInMillis();
    }

}
 
Hallo Leute,
wenn ich die Equals-Methode überschreibe, muss ich dies in allen Klassen tun wenn ich eine composition habe oder geht das noch einfacher bzw eleganter?
Die Methode equals soll sicherstellen, dass es sich inhaltlich um das gleiche Objekt handelt.
Im Gegensatz zum Vergleichsoperator (==). Dieser Vergleicht bei primitiven Typen den Wert und bei Objekten die Referenz. Er verglicht im dem Fall also ob es sich um ein und dasselbe Objekt handelt.
--> Wenn Du equals überschreibst sollte bei beinhalteten Objekten immer deren equals Methode verwendet werden. --> Jedes Objekt sollte eine passende Methode, wenn nötig zur Verfügung stellen.
z.B. eine Klasse Person.
Nehmen wir an eine Person ist gleich wenn sie denselben Namen hat und am gleichen Tag geboren ist. Dann könnte man equals in etwa so formulieren.
Java:
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class Person {
    public final String firstName;
    public final String lastName;
    private final long birthDay; // Tag in Millisekunden

    public Person(String firstName, String lastName, int day, int month, int year) throws IllegalArgumentException {
        if (firstName == null || lastName == null)
            throw new IllegalArgumentException("Bitte Vor- und Nachname eingeben!");
        this.firstName = firstName;
        this.lastName = lastName;
        this.birthDay = validateDay(day, month, year);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) // dasselbe Objekt
            return true;
        if (o == null || getClass() != o.getClass()) // Parameter null oder anderer Type
            return false;
        Person p = (Person) o; // caste das Objekt auf die benutzt Klasse
        if (birthDay != p.birthDay) // primitiver Datentyp -> benutze !=
            return false;
        if (!firstName.equals(p.firstName)) // String also benutze dessen equals Methode
            return false;
        return lastName.equals(p.lastName);// String also benutze dessen equals Methode
    }

    public String getBirthDay() {
        return new SimpleDateFormat("dd.MM.yyyy").format(new Date(birthDay));
    }

    @Override
    public String toString() {
        return lastName + " " + firstName + ", " + getBirthDay();
    }

    /**
     * Konvertiere Tag, Monat und Jahr in Millisekunden. Prüfe ob es sich um ein
     * gültiges Datum handelt.
     *
     * @param day
     * @param month
     * @param year
     * @return Datum in Millisekunden.
     * @throws IllegalArgumentException
     */
    private long validateDay(int day, int month, int year) throws IllegalArgumentException {
        Calendar c = new GregorianCalendar(year, --month, day);
        if (day != c.get(Calendar.DAY_OF_MONTH) || month != c.get(Calendar.MONTH) || year != c.get(Calendar.YEAR))
            throw new IllegalArgumentException(String.format("%d.%d.%d ist kein gueltiges Datum", day, month, year));
        return c.getTimeInMillis();
    }

}
 
Danke für die Erläuterung.

Wenn ich jetzt in der Main ein Objekt Person erzeuge, dann wird die Equals-Methode automatisch bereitgestellt und deswegen kann ich dann das Objekt (z.B. person1) abgleichen, wenn ich ein anders Objekt o übergebe, z.B. eine person2, die ich vorher auch schon in der Main erzeugt habe?

also deshalb funktioniert dann
Java:
if (person1.equals(person2)) {
    return true;
}

oder so?
Und mir war zunächst garnicht klar, dass ich die Equals-Methode in die Personen-Klasse schreiben muss.

Was ich mich jetzt vor allem noch frage: Was mach ich denn innerhalb der equals-Methode, wenn ich dem Personenobjekt noch ein anderes Objekt übergebe, wie in meinem Bsp. die Namensverwaltung? Da ist eine Person ja
Code:
Personen person1 = new Person ("Hans", "Meier", namensverwaltungPerson1); //welche ja zuvor erzeugt wurde.

Wie vergleiche ich denn nun diesen Teil vom Objekt in der equals-Methode am besten? Ich habe jetzt

Java:
public class Namensverwaltung {

    private String anrede;
    private float arbeitszeit;

    public Namensverwaltung (String anrede, float arbeitszeit) {
        this.anrede = anrede;
        this.arbeitszeit = arbeitszeit;
    }
    
    public String getAnrede() {
        return anrede;
    }
    public float getArbeitszeit() {
        return arbeitszeit;
    }
    
    
@override
    boolean equals(Personen vergleichsperson) {
        
        if (vorname.equals(vergleichsperson.getVorname()) && nachname.equals(vergleichsperson.getNachname()) && namensverwaltung.getAnrede().equals(vergleichsperson.namensverwaltung.getAnrede()) && namensverwaltung.getArbeitszeit() == vergleichsperson.namensverwaltung.getArbeitszeit() )   
                return true;
        else return false;
    
    }

funktioniert. Geht es einfacher bzw. eleganter?
 
Zuletzt bearbeitet:
Geht es einfacher bzw. eleganter?
Ja, da Du die Methode equals falsch überschreibst.
Java:
@override
boolean equals(Personen vergleichsperson) {      
        if (vorname.equals(vergleichsperson.getVorname()) && nachname.equals(vergleichsperson.getNachname()) && namensverwaltung.getAnrede().equals(vergleichsperson.namensverwaltung.getAnrede()) && namensverwaltung.getArbeitszeit() == vergleichsperson.namensverwaltung.getArbeitszeit() )  
                return true;
        else return false;  
    }
Die Methodensignatur muss wie folgt aussehen.
Java:
@Override
boolean equals(Object o) {
    ..  
}
Außerdem ist es nicht die Aufgabe von equals der Klasse Namensverwaltung eine Klasse Personen von außerhalb einzubeziehen.
equals
1)
hat eine vorgegebene Signatur, die ist strikt einzuhalten.
2) die Methode überprüft ob das übergebene Objekt inhaltlich gleich mit dem Objekt selbst ist.
Siehe nochmal meine Beispielklasse Person an.
Du kannst das Ganze für jede weitere Klasse analog machen.
 
Was ich mich jetzt vor allem noch frage: Was mach ich denn innerhalb der equals-Methode, wenn ich dem Personenobjekt noch ein anderes Objekt übergebe, wie in meinem Bsp. die Namensverwaltung?
Ich frage mich in diesem Fall eher, warum eine Person eine Namensverwaltung besitzen muss?

Sollte es nicht eine Verwaltung geben, die Personen enthält (Kasten = Verwaltung enthält Visitenkarten = Personen)?

Ich hab das jetzt nicht genau angeguckt, aber warum gehört z. B. die Anrede nicht zur Person?

Achte auch besser auf deine Benennungen! Da deine Klasse Personen heißt, geht jeder Programmierer, der das liest, davon aus, dass es sich um mehrere Personen, bzw. um eine Verwaltung oder Liste von Personen handelt. Besser wäre eine Klasse für genau eine Person mit dem Namen Person.

Die Klasse Namensverwaltung entspricht eher der Anrede und sollte daher besser Anrede heißen.

Eine Klasse sollte auch nur eine Aufgabe haben. Wenn es sich demnach um eine Klasse Anrede handelt, dann hat eine Arbeitszeit darin nichts verloren. Dafür wäre dann eine separate Klasse Arbeitszeit zuständig.

Das ist jetzt allerdings alles ins Blaue hinein gesponnen, weil ich deine Anforderungen nicht kenne und gar nicht weiß, was du da vor hast.
 
Zuletzt bearbeitet:
da Du die Methode equals falsch überschreibst.
Es ist allerdings löblich hervorzuheben, dass du die Annotation override verwendest. Damit wird dich der Compiler auf diesen Fehler hinweisen.

Beachte auch, dass i.d.R. auch hashCode() überschrieben werden muss, wenn man equals() überschrieben hat!
 
Zuletzt bearbeitet:
Der Vergleich getClass() != o.getClass() in der equals-Methode ist ungünstig.
Der Grund, warum ich den instanceof-Ansatz bevorzuge, ist, dass bei Verwendung des getClass-Ansatzes die Einschränkung besteht, dass Objekte nur mit anderen Objekten derselben Klasse, d. h. desselben Laufzeittyps, gleich sind. Wenn man eine Klasse erweitert und ihr ein paar harmlose Methoden hinzufügt und dann prüft, ob ein Objekt der Unterklasse gleich einem Objekt der Oberklasse ist, selbst wenn die Objekte in allen wichtigen Aspekten gleich sind, erhält man die überraschende Antwort, dass sie nicht gleich sind. Dies verstößt gegen eine strenge Auslegung des Liskovschen Substitutionsprinzips und kann zu sehr überraschendem Verhalten führen. In Java ist dies besonders wichtig, weil die meisten Sammlungen (HashTable usw.) auf der Methode equals basieren. Legt man ein Mitglied der Oberklasse als Schlüssel in eine HashTable und sucht dann mit einer Instanz der Unterklasse danach, wird man es nicht finden, weil sie nicht gleich sind.
Java:
    @Override
    public int hashCode() {
        return Objects.hash(this.birthDay, this.firstName, this.lastName);
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Person)) {
            return false;
        }
        final Person other = (Person) obj;
        return this.birthDay == other.birthDay && Objects.equals(this.firstName, other.firstName)
                && Objects.equals(this.lastName, other.lastName);
    }
 
Und ganz nebenbei einfach einmal ein paar Hinweise von meiner Seite:
a) Wenn einen dieses Thema interessiert, dann gibt es sehr viele Seiten, die dieses Thema betrachten und Vorschläge machen, wie sowas umgesetzt werden kann und was ggf. bedacht werden sollte. Eine Suche nach "Java equals überschreiben" könnte sich z.B. anbieten. Da finden sich dann bei vielen Treffen auch eine Begründung, warum hashcode auch überschrieben werden soll.

b) wenn man sowas machen will / muss, dann bieten die Entwicklungsumgebungen dazu oft eine Generierung an. Also einfach der Entwicklungsumgebung sagen, dass man equals überschreiben will. Die IntelliJ Sicht ist da einfach:
- Generate aufrufen
- equals() and hashcode() kann man dann nur auswählen. -> Dass hashcode also mit überschrieben werden sollte, wird gleich mit bedacht
- Dann darf man auswählen, welche Methode verwendet werden soll. Da kann man einfach mal die diversen Methoden ausprobieren um zu schauen: Was kommt bei IntelliJ Default raus? Und was kommt bei dem "Objects.equals ..." raus? (Die anderen EInträge sind meist rot und deaktiv, weil die auf Libraries zurückgreifen, die Du vermutlich nicht eingebunden hast.)

c) Sowas wird auch gerne mal als Boilerplate Code angesehen. Daher ist das etwas, das man generieren lässt. Wenn man das aber eh generieren lässt, dann kann dies auch ein Annotation Processor generieren. Hier wäre dann z.B. Lombok zu nennen. Aber Achtung: Gerade am Anfang rate ich dringend davon ab, sich damit zu beschäftigen! Eine Art "Magie", die irgendwas im Hintergrund macht und die man nicht versteht, ist nie gut! Man sollte Verstehen, was sein Code im Detail macht!
 
Der Grund, warum ich den instanceof-Ansatz bevorzuge, ist, dass bei Verwendung des getClass-Ansatzes die Einschränkung besteht, dass Objekte nur mit anderen Objekten derselben Klasse, d. h. desselben Laufzeittyps, gleich sind.
Dies verstößt gegen eine strenge Auslegung des Liskovschen Substitutionsprinzips und kann zu sehr überraschendem Verhalten führen.
Das ist völlig korrekt. Es sollte nicht verschwiegen werden, dass auch der (bessere) Ansatz mit instanceof Probleme hat. Wird einer erbenden Klasse eine Wertkomponente hinzugefügt, dann ergibt ein Vergleich mit einer Instanz der (einer) Elternklasse möglicherweise ein falsches Ergebnis, weil dieser Wert ja nicht berücksichtigt werden konnte. Das generelle Problem ist allerdings nicht lösbar, siehe auch "Effective Java" von Joshua Bloch.
 
Zuletzt bearbeitet:
Der Vergleich getClass() != o.getClass() in der equals-Methode ist ungünstig.
Der Grund, warum ich den instanceof-Ansatz bevorzuge, ist, dass bei Verwendung des getClass-Ansatzes die Einschränkung besteht, dass Objekte nur mit anderen Objekten derselben Klasse, d. h. desselben Laufzeittyps, gleich sind.
instanceof ist hier der falsche Ansatz. --> bei jeder gerbten Klasse müsste wieder gecheckt werden ob das übergebene Objekt vom selben Typ ist.
Das ist nämlich die Voraussetzung, dass 2 Objekte inhaltlich gleich sind .
Nehmen wir meine obige Klasse Person und erweitern diese um einen 2ten Vornamen.
Es versteht sich von selbst, dass die Methode equals überschrieben werden muss und dort der 2te Name auf Gleichheit gecheckt wird.
Andernfalls wäre Peter Aigner, 01.10.1999 == Hans Peter Aigner, 1.10.1999 wahr.
Java:
public class PersonExt extends Person {
    private String secondName;

    public PersonExt(String firstName, String lastName, int day, int month, int year) throws IllegalArgumentException {
        super(firstName, lastName, day, month, year);
    }
    @Override
    public boolean equals(Object o) {
        if (!super.equals(o))
            return false;
        // instanceOf in der super Methode würde hier ein weiteres instanceOf erfordern da o vom Typ Person sein kann
        PersonExt p = (PersonExt) o; // Cast ist hier erlaubt da die Klassen sicher gleich sind
        if (secondName == null)
            return p.secondName == null;
        if (p.secondName == null)
            return false;
        return p.secondName.equals(secondName);
    }

    public String getSecondName() {
        return secondName;
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }

    @Override
    public String toString() {
        return firstName == null ? super.toString() : firstName + ", " + super.toString();
    }

}

Dabei verwenden wir die equals Methode der Elternklasse. Da dort nicht mit instanceOf geprüft wird sondern gecheckt wird ob es sich um dieselbe Klasse handelt brauchen wir das nach dem Aufruf der super Methode nicht mehr checken. Da diese bei Ungleichheit ein false zurückgeben würde.
InstanceOf hätte das Problem, dass eien von Person abgeleitete Klasse die Ungleichheit der Klassen nicht erkennt.
 
Zuletzt bearbeitet:
Evtl. ist interessant, wie das Lombok gelöst hat:
Java:
  @Override public boolean equals(Object o) {
    if (o == this) return true;
    if (!(o instanceof EqualsAndHashCodeExample)) return false;
    EqualsAndHashCodeExample other = (EqualsAndHashCodeExample) o;
    if (!other.canEqual((Object)this)) return false;
    if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
    if (Double.compare(this.score, other.score) != 0) return false;
    if (!Arrays.deepEquals(this.tags, other.tags)) return false;
    return true;
  }
  
  protected boolean canEqual(Object other) {
    return other instanceof EqualsAndHashCodeExample;
  }

Dass Problem, das @Blender3D aufzeigt, existiert. Und auch das Problem, dass @LimDul aufgezeigt hat.

Daher gibt es eine zweite Methode, die dann auch mit überschrieben wird wenn man von der Klasse noch einmal ableitet, die dann auf dem anderen Part aufgerufen wird. Eine Person mit zweitem Vornamen lässt sich dann nicht vergleichen.

Damit ist man fast bei dem Vergleich der Klassen, dann man hat in beide Richtungen das instanceOf. Aber für den Fall, den @LimDul skizziert hat: "Neues Verhalten aber keine neuen Daten" würde man es nicht überschreiben und schon wäre dieses Verhalten auch abgedeckt.

Das aber nur am Rande. Ich will diese Lösung nicht als beste Lösung verkaufen oder so. Es soll nur eine Alternative aufzeigen und zum Nachdenken anregen.
 
Zitat aus dem o. g. Buch
Es gibt keine Möglichkeit, eine instanziierbare Klasse zu erweitern und eine Wertkomponente hinzuzufügen und dabei gleichzeitig den equals-Vertrag einzuhalten, es sei denn, Sie sind bereit, auf die Vorteile der objektorientierten Abstraktion zu verzichten.
 
instanceof ist hier der falsche Ansatz. --> bei jeder gerbten Klasse müsste wieder gecheckt werden ob das übergebene Objekt vom selben Typ ist.
Das ist nämlich die Voraussetzung, dass 2 Objekte inhaltlich gleich sind .
Die Typen müssen nicht identisch sein, um „gleich“ zu sein.
Einfaches Beispiel sind alle Collections, weiteres ist das Proxy-Pattern.

Beide Varianten können sinnvoll sein, instanceof sollte man idealerweise aber in Verbindung mit final nutzen.
 
Ja, da Du die Methode equals falsch überschreibst.
Ich habe es auch nicht 100 % korrekt reingepostet ist mir aufgefallen, die equals-Methode steht in der Klasse Personen.

Es ist allerdings löblich hervorzuheben, dass du die Annotation override verwendest. Damit wird dich der Compiler auf diesen Fehler hinweisen.

Beachte auch, dass i.d.R. auch hashCode() überschrieben werden muss, wenn man equals() überschrieben hat!
Danke für den Hinweis. Hatte zwar schon in einem anderen Thread danach gefragt aber hatte es nicht auf dem Schirm. Aber ich bekomme vom Compiler aktuell keinen Fehlerhinweis. Trotz der Anmerkung von Blender.

Ich frage mich in diesem Fall eher, warum eine Person eine Namensverwaltung besitzen muss?
[...]
Achte auch besser auf deine Benennungen! Da deine Klasse Personen heißt, geht jeder Programmierer, der das liest, davon aus, dass es sich um mehrere Personen, bzw. um eine Verwaltung oder Liste von Personen handelt. Besser wäre eine Klasse für genau eine Person mit dem Namen Person.
Du hast natürlich völlig recht, sowohl Klassenbezeichnungen als auch Inhalte sind etwas Banane, ist mir ziemlich am Anfang auch schon klar geworden. Und danke für deine Hinweise, ich bin da meist recht schnell mit irgendwelchen Namen bei der Hand. Ich habe zwischenzeitl. auch etwas mit den Variablen rumgespielt und jetzt gehört Anrede bspw. in die Personen-Klasse. Aber aus Personen mach ich nachträglich ja keine Person mehr. Oder kann ich bspw. Klassennamen in Eclipse ohne Aufwand mal eben ändern?
Das ist jetzt allerdings alles ins Blaue hinein gesponnen, weil ich deine Anforderungen nicht kenne und gar nicht weiß, was du da vor hast.
Kannst du ja auch nicht wissen, habs nicht erwähnt. 😉 Habe auch nicht viel vor als Learning by doing, einzelne Übungsaufgaben die mehr oder weniger miteinander zu tun haben (oder eben halt auch nicht). Das ganze hier rührt von einer Übungsaufgabe her die ich dann um YT-Video-Input erweitert habe (mit der Composition, die eigntl. nicht gefordert war und für die musste schnell noch irgendwas her, also habe ich da die z.B. Anrede reingestopft) und weil ich keinen Bock hatte für jede Aufgabe ein neues Projekt zu erstellen habe ich die Klassen einfach weiterbenutzt. So kann ich auch immer mal wieder schauen, was bisher schon drin hatte (z.B. toStrings).

Und ganz nebenbei einfach einmal ein paar Hinweise von meiner Seite:
a) Wenn einen dieses Thema interessiert, dann gibt es sehr viele Seiten, die dieses Thema betrachten und Vorschläge machen, wie sowas umgesetzt werden kann und was ggf. bedacht werden sollte. Eine Suche nach "Java equals überschreiben" könnte sich z.B. anbieten. Da finden sich dann bei vielen Treffen auch eine Begründung, warum hashcode auch überschrieben werden soll.
Mach ich, keine Sorge. Ich hab die Insel hier rumfliegen, Studienbriefe und finde nat. zu allem auch Internet-Texte. Irgendwie adressiert das bei mir aber nicht die richtigen Kanäle, ich komm mit Videos weitaus besser klar, aber das ist nat. nicht immer passend zu den Übungsaufgaben etc. - und das Forum ist ohnehin Gold wert!

So und viel von den weiterführenden Diskussionen hier verstehe ich inhaltlich auf die Schnell ohnehin nicht, deswegen spar ich mir meinen Senf für andere Sachen auf 😀

Danke für eure Rückmeldungen.
 

Neue Themen


Zurück
Oben