Interface für Verhalten von "=="?

Djinndrache

Bekanntes Mitglied
Angenommen wir haben eine simple User Class.
Java:
class User {
private int userID;
//konstruktor setzt userID
}


Man kann prüfen ob zwei Userobjekte identisch sind indem man einfach prüft:
Java:
User user = new User(1);
User user2 = user;
if(user == user2){
// true
}
User user3 = new User(1);
if(user == user3){
// false :(
}

Aber sagen wir mal ich habe jetzt nicht unbedingt immer identische Userobjekte, und dennoch sind sie inhaltlich gleich. Ich möchte die Klasse User jetzt irgendwie so erweitern (gibts dafür bestimmte Interfaces?), dass der "=="-Operator anders behandelt wird. Zum Beispiel soll "user == user3" true sein, wenn die userID der objekte identisch sind.

Gibt es irgendein Interface das man implementieren kann, mit dem man user dann erweitert durch eine Methode à la:
Java:
@Override
public boolean equals(User other){
return this.getID() == other.getID();
}



Mir ist natürlich klar, dass ich die Methode equals() einfach so nehmen könnte zum vergleichen von Usern. Mich interessiert nur ob man quasi das Verhalten von "==" durch irgend ein Interface oder so verändern kann.
 
Zuletzt bearbeitet:

Volvagia

Top Contributor
Wenn du jede Operation nach belieben ändern würdest, wie soll jemand anders (oder auch du in einen Monat oder vielleicht sogar Jahr) das nachvollziehen können?
In Java weiß man immer genau was die Operationen tun. Es haben zwar ein paar Operationen mit mehreren Funktionen (+ addieren von Zahlen und zusammenfügen von Strings, & booleanische and ohne Kurzschluss und bitweises and, | booleanisches or ohne Kurzschluss und bitweises or), aber man weiß genau, was Object o = (new Object() + new Object()) machen würde. (Nen Fehler auspucken)

Interface haben auch nichts mit den Operatoren zu tun, die stellen nur sicher, dass eine bestimmte Methode implementiert ist oder markieren eine Klasse für einen bestimmten Zweck (z. B. Clonable oder Serializable). Beispielsweiße kann man eine ArrayList oder eine LinkedList in eine List-Variable (List ist das Interface) schreiben, solange man nur Methoden braucht die in List definiert sind. So kann man bequem list = new ArrayList<?>(); in list = new LinkedList<?>(); ändern, ohne einen anderen Teil des Codes auszutauschen. Geht natürlich auch zur Laufzeit.
Nennt sich wenn ich mich nicht täusche "Gegen das Interface programmieren".
 

Daassan

Mitglied
Zudem nutzen die meisten libs von java selbst die equels-methode.
wenn du versuchst == zu überschreiben, verbaust du dir viele funktionen der java-libs.

ACHTUNG Überschreib immer die Equels-Methode von Object (in deinem beispiel schreibst du eine neue und überschreibst nicht), denn nur diese wird letztlich genutzt.
(equals(Objekt o))

könnte bei dir dann so aussehen:
Java:
public boolean equals(Object o)
{
     if(!o instanceof User) return false;
     return this.getID() == other.getID();
}
 
P

Pippl

Gast
In C# funktioniert das Operator überladen. Es ist auch oft hilfreich, kann natürlich auch zu den erwähnten Problemen führen (was passiert bei diesem oder jenem '==').

Ist ein Framework entsprechend dokumentiert, sind die Überladungen kein Problem. Zuviele Überladungen (bzw. schlecht dokumentierte) sind natürlich sinnfrei.
 

Djinndrache

Bekanntes Mitglied
Zudem nutzen die meisten libs von java selbst die equels-methode.
wenn du versuchst == zu überschreiben, verbaust du dir viele funktionen der java-libs.

ACHTUNG Überschreib immer die Equels-Methode von Object (in deinem beispiel schreibst du eine neue und überschreibst nicht), denn nur diese wird letztlich genutzt.
(equals(Objekt o))

könnte bei dir dann so aussehen:
Java:
public boolean equals(Object o)
{
     if(!o instanceof User) return false;
     return this.getID() == other.getID();
}

Dazwischen fehlt noch
Java:
User other = (User) o;
aber ich weiß was du meinst. Danke :)
 

faetzminator

Gesperrter Benutzer
Normalerweise generiert dir die IDE deiner Wahl auf Wunsch die Methoden [c]equals()[/c] und [c]hashCode()[/c]. Kann so aussehen:
Java:
public class Foo {

    private String foo;
    private Object bar;
    private int number;

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (bar == null ? 0 : bar.hashCode());
        result = prime * result + (foo == null ? 0 : foo.hashCode());
        result = prime * result + number;
        return result;
    }

    @Override
    public boolean equals(final Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        Foo other = (Foo) obj;
        if (bar == null) {
            if (other.bar != null) {
                return false;
            }
        }
        else if (!bar.equals(other.bar)) {
            return false;
        }
        if (foo == null) {
            if (other.foo != null) {
                return false;
            }
        }
        else if (!foo.equals(other.foo)) {
            return false;
        }
        if (number != other.number) {
            return false;
        }
        return true;
    }
}
 
S

SlaterB

Gast
na sowas würde ich mir nicht generieren lassen ;) ,
lieber doch erst die ints vergleichen, das geht schnell,

für jedes Objekt-Attribut 8 Zeilen ist auch traurig, da reicht eine:
Java:
if (!Helper.equal(foo,other.foo)) return false;
in der Hilfsmethode dann auf null prüfen und gegebenenfalls equals aufrufen

hashCode() immerhin einzeilig
 

Volvagia

Top Contributor
Möglicherweiße gibts da irgendwelche Kniffe die ich noch nicht kenne, aber das Meiste ist wohl nicht notwendig. ^^
Man braucht this nicht auf null zu testen, da man auf null keine Instanzmethode aufrufen kann. instanceof prüft ob es die selbe Klasse ist (oder eine Subklasse) und enthält einen null-Check für den Parameter. Das einzige was man Daassan Methode noch hinzufügen könnte wäre ein Vergleich mit super.equals (wenn von Object erbt ist dass das Selbe wie ==, wenn nicht werden auch die Variablen der Superklasse geprüft, sofern diese richtig überschreibt), aber das war dann glaub ich alles.
 

faetzminator

Gesperrter Benutzer
Falsch, denn [c]instanceof[/c] kann zu Verletzungen der wie heissen diese Regeln schon wieder? führen. Wenn eine Klasse [c]Bar[/c] von [c]Foo[/c] abgeleitet ist, könnte mit [c]instanceof[/c] theoretisch [c]Foo#equals(Bar) == true[/c] und [c]Bar#equals(Foo) == false[/c] passieren!
 

Volvagia

Top Contributor
Das stimmt natürlich. War der selbe Fehler wie der verallgemeinerlichte super-Aufruf. Ich hab die Klasse als geschlossenes (Object -|> Klasse) System und nicht in einer potentiell größeren Vererbungshierarchie betrachtet.

Danke, so genau hab ich mir darüber noch nie Gedanken gemacht.
 

faetzminator

Gesperrter Benutzer
Habs auch lange mit [c]instanceof[/c] gemacht, aber jetzt weiss ich es besser und machs erst noch nicht mehr von Hand ;) Kommt auf diese paar Zeilen mehr oder weniger (am Ende der Klasse) auch nicht drauf an...
 
S

SlaterB

Gast
speziell equals sollte man auch nicht gerade so unerwartet implementieren, dass etwa der allgemeine Contract verletzt wird,
dann schon eine eigene Methode, gleich mit passenden Namen, so wird der Leser bestens vorbereitet

ob ein Objekt ein und dasselbe wie ein anderes ist, ist eine immer benötigte Standardfunktion,
egal welche Klasse, allein schon bei allgemeiner Verarbeitung wie Einfügen in eine Liste,
die ist in der Sprache unter == untergebracht und sollte nicht zerstört werden
 

Marco13

Top Contributor
In C++ kann man sogar den Zuweisungsoperator überladen (und eigentlich alle, bis auf ganz wenige Ausnahmen), und ersteres muss oder sollte man sogar meistens. Die Komplexität, die der Sprache mit Operatorüberladung aufgebürdet wird, ist dabei ein mögliches Gegenargument. Viel wichtiger finde ich persönlich, dass so ein Feature tendenziell auch von Leuten genutzt wird, die meinen, ein Ring wäre so ein rundes Ding, eine Gruppe mehrere Leute, und ein Körper das, was sie unter dem Hals haben.
 
B

bygones

Gast
Das ist doch Quark. Höre diese "Begründung" so oft, nur wahrer wird sie dadurch nicht. Ich mein, ein equals() kann ich auch falsch oder unerwartet implementieren, da stört das aber niemanden?
ich rede hier nicht von falscher oder richtiger Implementierung. Wenn du equals siehst gehst du von der Gleichheitspruefung aus, unabhaengig davon ob sie richtig implementiert ist.

Bei == geht man von der identiaetspruefung aus, bei + von addition etc.

Principle of least astonishment ist hier meine Begruendung, man hat bei manchen Sprachkonstruktoren Erwartungen, die man als Entwickler nicht brechen sollte
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
U Interface für abgeleitete Klasse Java Basics - Anfänger-Themen 5
I Interface Comparable für Server-Item-Interface Java Basics - Anfänger-Themen 12
E Clonable-Interface für Backups nutzen Java Basics - Anfänger-Themen 2
B Variablen keine Arrayübergabe für getter im Interface Java Basics - Anfänger-Themen 8
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
P Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben