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? :D

Danke und schönes Rest-Wochenende
 

Blender3D

Top Contributor
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();
    }

}
 

Blender3D

Top Contributor
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();
    }

}
 

Wuast

Bekanntes Mitglied
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:

Blender3D

Top Contributor
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.
 

temi

Top Contributor
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:

temi

Top Contributor
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:

Oneixee5

Top Contributor
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);
    }
 

KonradN

Super-Moderator
Mitarbeiter
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!
 

temi

Top Contributor
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:

Blender3D

Top Contributor
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:

KonradN

Super-Moderator
Mitarbeiter
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.
 

temi

Top Contributor
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.
 

mrBrown

Super-Moderator
Mitarbeiter
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.
 

Wuast

Bekanntes Mitglied
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 :D

Danke für eure Rückmeldungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Methoden Equals Methode für Integer und Objekte überschreiben? Java Basics - Anfänger-Themen 9
C Long value an Stringbuilder übergeben, equals Methode funktioniert nicht Java Basics - Anfänger-Themen 2
J compareTo()- und equals-Methode Java Basics - Anfänger-Themen 3
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
G Java equals() Methode Java Basics - Anfänger-Themen 9
O equals Methode möglichst effizient Java Basics - Anfänger-Themen 13
H equals methode Java Basics - Anfänger-Themen 1
L Logistiksystem Methode equals und hashcode Java Basics - Anfänger-Themen 20
H equals Methode Java Basics - Anfänger-Themen 1
S equals Methode bei String Java Basics - Anfänger-Themen 5
K Vererbung equals-Methode bei Vererbung abstrakter Klassen Java Basics - Anfänger-Themen 8
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
E Equals-Methode auf Class-Object Java Basics - Anfänger-Themen 17
J Methode equals() Java Basics - Anfänger-Themen 7
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
A veränderbar kanonische Klassen: Methode equals, hashcode, serializable Java Basics - Anfänger-Themen 5
C 2 Objekte (mathematisch) vergleichen in der equals Methode Java Basics - Anfänger-Themen 10
C hilfe bei equals Methode - es geht ums Bestehen Java Basics - Anfänger-Themen 7
G equals-Methode Java Basics - Anfänger-Themen 4
Say Equals Java Basics - Anfänger-Themen 6
W LocalDate vergleichen mit Equals? Java Basics - Anfänger-Themen 7
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
X Datentypen String.equals funktioniert nicht Java Basics - Anfänger-Themen 5
S 2 Strings mit Equals vergleichen Java Basics - Anfänger-Themen 11
lallmichnichtzu Methoden Überladen des .equals-Operators Java Basics - Anfänger-Themen 6
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
M Objekte mittels equals vergleichen Java Basics - Anfänger-Themen 14
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
J equals funktioniert nicht - Warum Java Basics - Anfänger-Themen 13
B Date - Vergleich (equals / after) ? Java Basics - Anfänger-Themen 3
G Ratlosigkeit zur Aufgabe im Anhang (boolean, equals.) Java Basics - Anfänger-Themen 20
D Unterschied == und equals in Arrays Java Basics - Anfänger-Themen 2
M Erste Schritte Mehrere eingaben in einer Line vergleichen (if equals...) Java Basics - Anfänger-Themen 6
I equals (Override) mit eigener Exception (keine Runtime-Exception) Java Basics - Anfänger-Themen 9
A OOP Richtige Verwendung von ArrayList und equals Java Basics - Anfänger-Themen 24
E equals Prüfung fehlgeschlagen Java Basics - Anfänger-Themen 3
C Objekt equals Java Basics - Anfänger-Themen 2
L String überprüfen mit .equals .contains oder .matches? Java Basics - Anfänger-Themen 1
F String equals NULL Problem Java Basics - Anfänger-Themen 4
D Auf equals von Vaterklasse zugreifen Java Basics - Anfänger-Themen 4
S Methoden equals(object o) / toString Java Basics - Anfänger-Themen 15
E Calender - Equals Problem Java Basics - Anfänger-Themen 14
T Datentypen compareTo() u. equals() bei Strings Java Basics - Anfänger-Themen 3
Psypsy hashCode, equals und toString Java Basics - Anfänger-Themen 3
K hashCode, compareTo vs. equals Java Basics - Anfänger-Themen 3
M Vergleich zweier Array Stellen mit equals/NullpointerException Java Basics - Anfänger-Themen 9
S Unterschiede zwischen equals und contains Java Basics - Anfänger-Themen 2
F Erste Schritte Hilfe bei Übung zu String equals() und Schleifen Java Basics - Anfänger-Themen 8
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
S compareTo() und equals() Java Basics - Anfänger-Themen 6
R illegal start of expression - 3 Strings vergleichen mit .equals () Java Basics - Anfänger-Themen 5
K Cast bei equals Java Basics - Anfänger-Themen 2
T SQL equals Java Basics - Anfänger-Themen 4
OnDemand Methoden Equals Methde Java Basics - Anfänger-Themen 3
D if block mit equals im rumpf Java Basics - Anfänger-Themen 11
K String - Equals Java Basics - Anfänger-Themen 2
J Klassen Warum ist (a.equals(b)) gleich (a==b)? Java Basics - Anfänger-Themen 13
B Warum gibst hier Equals false zurück ? Java Basics - Anfänger-Themen 23
S Verständnissfrage equals() Java Basics - Anfänger-Themen 2
R compareTo & equals Java Basics - Anfänger-Themen 10
M Verschiedene Möglichkeiten mit 'equals' abdecken? Java Basics - Anfänger-Themen 9
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
W Stringvergleich mit equals Java Basics - Anfänger-Themen 13
C equals() Java Basics - Anfänger-Themen 4
D Problem mit string.equals bzw string.contains Java Basics - Anfänger-Themen 4
T Problem mit der while(!string.equals("x")) Java Basics - Anfänger-Themen 2
X problem mit equals.gelöst Java Basics - Anfänger-Themen 2
M Equals überschreiben Java Basics - Anfänger-Themen 3
K equals() und hashcode() überschreiben Java Basics - Anfänger-Themen 5
K equals in Hashmap() Java Basics - Anfänger-Themen 4
B if equals(irgendeine Zahl+Buchstabe) Java Basics - Anfänger-Themen 6
T equals() und hashCode() Java Basics - Anfänger-Themen 7
D probs mit clone und equals Java Basics - Anfänger-Themen 10
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
N Vergleich per equals Java Basics - Anfänger-Themen 5
S comparable und equals Java Basics - Anfänger-Themen 7
M Frage zu Textvergleich (equals) Java Basics - Anfänger-Themen 8
G Strings vergleichen mit equals, geht das kürzer? Java Basics - Anfänger-Themen 4
B Frage zu Funktion mit equals Java Basics - Anfänger-Themen 17
J Gibt es eine möglichkeit ähnlich wie .equals(bedingung1 ||bedingung ..n) ? Java Basics - Anfänger-Themen 5
D "2010–03–12".equals( "2010-03-12" ) Java Basics - Anfänger-Themen 6
X Frage zur Implementierung von equals() Java Basics - Anfänger-Themen 2
T Problem mit equals Java Basics - Anfänger-Themen 5
K Equals,Instanceof und "==" Java Basics - Anfänger-Themen 7
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
E Java hashCode equals Problem Java Basics - Anfänger-Themen 2
S equals vergleich Java Basics - Anfänger-Themen 10
H Equals hascode Java Basics - Anfänger-Themen 5
S Equals Downcast? Java Basics - Anfänger-Themen 11
D equals Vergleiche Java Basics - Anfänger-Themen 7
L String mit equals vergleichen Java Basics - Anfänger-Themen 6
neurox Tutorial equals und hashCode überschreiben Java Basics - Anfänger-Themen 33
F String equals null wird nicht angenommen. Java Basics - Anfänger-Themen 24
A Reihenfolge bei equals() Java Basics - Anfänger-Themen 2
P Toleranz bei equals Java Basics - Anfänger-Themen 4
B Frage zu equals() und hashCode() Java Basics - Anfänger-Themen 28
D String#equals + String#charAt Java Basics - Anfänger-Themen 5
S equals() - hashCode() - Contract Java Basics - Anfänger-Themen 54
G mehrere Werte für .equals ? Java Basics - Anfänger-Themen 22
T [SOLVED] Java String equals funktioniert nicht Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben