Interface Equals und hashCode

Schuriko

Bekanntes Mitglied
Gibt es eigentlich in Java ein vordefiniertes Interface, was kenntlich macht, dass eine Klasse über die Methoden equals und hashCode verfügt?
 

M.L.

Top Contributor
Oder ist die Frage (auch) so zu verstehen, dass eine Klasse über eine eigene/überschriebene Implementierung von equals() und hashCode() verfügt ?
 
K

kneitzel

Gast
Oder ist die Frage (auch) so zu verstehen, dass eine Klasse über eine eigene/überschriebene Implementierung von equals() und hashCode() verfügt ?
In dem Fall kann man Reflection nutzen.

a) Refrerenz auf die Klasse (Klassenname.class oder instance.getClass()) holen.
b) auf der Klasse mit getMethod die Methode holen.
c) auf der Methode getDeclaringClass aufrufen und mit Klasse aus a) vergleichen.
 

thecain

Top Contributor
Da würde ich eher eine Annotation machen, welche das prüft und zur compile Zeit einen Fehler wirft. (Oder gar nichts, sauber mit Tests sollte man da ja sowieso keinen Fehler haben)

Ich sehe nämlich gerade keinen Grund, warum das zu Laufzeit geprüft werden müsste
 

Schuriko

Bekanntes Mitglied
Mich würde auch mal der Kontext bzw. Grund der Frage interessieren.
Also der Grund ist folgender: Ich habe in einem Objekt ein Attribut welches drei unterschiedliche Klassen sein können. Hier mal etwas vereinfacht shematisch dargestellt:

Code:
class Container {
    Object aufnahme;              // Aufnahme nur für ClassA, ClassB, ClassC nicht ClassD
}

class ClassA {
     ....
}

class ClassB {
     ....
}

class ClassC {
     ....
}

class ClassD {
     ....
}
Die Kontainer Klasse soll es zulassen, dass ClassA, ClassB und ClassC (die nicht voneinander abgeleitet sind) aufnehmen kann.
Die ClassD ist hierfür nicht erlaubt.
 
K

kneitzel

Gast
Wie kommt man zu so einem Konstrukt?

Also ich finde es zumindest seltsam und ich frage mich gerade, was für Operationen du darauf machen willst / musst....

Du kannst da 3 Setter und 3 Getter bauen. Dann kannst du dank polymorphie nur die drei erlaubten Dinge zuweisen. Getter ist aber blöd, da hast du dann ggf 3 unterschiedliche Namen....

Aber da würde ich erst einmal das Design in Frage stellen / hinterfragen ....
 

temi

Top Contributor
Kannst du evtl. die Klassen A, B und C mit einem Marker-Interface versehen? Oder sind die von dir nicht veränderbar?
Java:
interface ContainerObject {}

class Container {
    ContainerObject aufnahme;              // Aufnahme nur für ClassA, ClassB, ClassC nicht ClassD
}

class ClassA implements ContainerObject {
     ....
}

class ClassB implements ContainerObject {
     ....
}

class ClassC implements ContainerObject {
     ....
}

class ClassD {
     ....
}

Das macht aber die spätere Verwendung auch nicht leichter...

EDIT: Aber was hat das eigentlich mit equals() und hashCode() zu tun?
 
Zuletzt bearbeitet:

Schuriko

Bekanntes Mitglied
Kannst du evtl. die Klassen A, B und C mit einem Marker-Interface versehen? Oder sind die von dir nicht veränderbar?
Java:
interface ContainerObject {}

class Container {
    ContainerObject aufnahme;              // Aufnahme nur für ClassA, ClassB, ClassC nicht ClassD
}

class ClassA implements ContainerObject {
     ....
}

class ClassB implements ContainerObject {
     ....
}

class ClassC implements ContainerObject {
     ....
}

class ClassD {
     ....
}

Das macht aber die spätere Verwendung auch nicht leichter...

EDIT: Aber was hat das eigentlich mit equals() und hashCode() zu tun?
Das hatte ich auch vor. Deshalb kam ich darauf, ob equals, hash, clone funktion basiert. Momentan habe ich ein "abstrakt" Interface um diese Klassen kenntlich zu machen.
 

Schuriko

Bekanntes Mitglied
Wie kommt man zu so einem Konstrukt?

Also ich finde es zumindest seltsam und ich frage mich gerade, was für Operationen du darauf machen willst / musst....

Du kannst da 3 Setter und 3 Getter bauen. Dann kannst du dank polymorphie nur die drei erlaubten Dinge zuweisen. Getter ist aber blöd, da hast du dann ggf 3 unterschiedliche Namen....

Aber da würde ich erst einmal das Design in Frage stellen / hinterfragen ....
Nun leider sieht es W3C anders. Für die HTML Canvas gibt es ein fillStyle / strokestyle, welches wahlweise Farbe, Gradient oder Image sein kann.
 

mrBrown

Super-Moderator
Mitarbeiter
Nun leider sieht es W3C anders. Für die HTML Canvas gibt es ein fillStyle / strokestyle, welches wahlweise Farbe, Gradient oder Image sein kann.
Ne, das widerspricht der Aussage von @JustNobody nicht :)

Das ist dann halt ein Interface "StrokeStyle" (oder wie auch immer man sie nennen möchte), das muss ja dann nicht mal leer sein.


Ein Pendant aus JavaFX wäre dazu zB https://docs.oracle.com/javase/8/javafx/api/javafx/scene/layout/Border.html, das ist auch eine mögliche Variante.


Das hatte ich auch vor. Deshalb kam ich darauf, ob equals, hash, clone funktion basiert. Momentan habe ich ein "abstrakt" Interface um diese Klassen kenntlich zu machen.
Aber equals und hash hat doch jedes Objekt, was war denn die Idee dahinter, wie es damit eingeschränkt werden soll?
 
K

kneitzel

Gast
Ja, wie mrBrown das schon richtig gesagt hat: Dann ist das so ein Style und das kann dann ein Interface sein. Und schon hast Du auch das, was temi vorgeschlagen hat. So etwas sollte man aus meiner Sicht auf jeden Fall haben.
 

mrBrown

Super-Moderator
Mitarbeiter
Noch als Anmerkung: in anderen Sprachen könnte man das zB über Union-Types abbilden, in Java könnten Sealed-Types interessant sein, wobei man dafür dann auch das Interface braucht.
 

httpdigest

Top Contributor
Leider nein, habe ich mir auch schon oft gewünscht. Das Fehlen eines solchen Interface ist nach meiner Meinung ein Geburtsfehler von Java.
Das Problem ist dann doch eher, dass java.lang.Object bereits die Methoden equals()/hashCode() implementiert, und nicht, dass es kein solches Interface gibt (bzw. geben kann). Die blosse Existenz einer "eigenen" equals()/hashCode() Implementierungsmethode sagt ja nichts darüber aus, wie diese implementiert ist:
Java:
public class MyOwnClass implements WithHashCodeAndEquals {
  public int hashCode() {
    return super.hashCode();
  }
  public boolean equals(Object o) {
    return super.equals(o);
  }
}
Warum würde jemals jemand wissen wollen, ob eine Klasse eine eigene equals()/hashCode() Überschreibung hat?
Wahrscheinlich ist es manchmal wichtig, zu wissen, ob die Gleichheit zweier Instanzen einer Klasse auf der Objektidentität oder auf einem Wertevergleich (im Sinne eines "value objects") basiert. Das könnte ich mir vorstellen. Das hat aber ja nichts damit zu tun, ob es nun equals()/hashCode() gibt, oder nicht, da man diese ja wie gesagt beliebig implementieren kann.
 

Barista

Top Contributor
@httpdigest Du hast es genauer formuliert als ich, java.lang.Object sollte nicht hashCode und equals implementieren (eventuell sollte es java.lang.Object gar nicht geben). Ein entsprechendes Interface würde eine eigene Implementierung erzwingen, diese kann aber auch fehlerhaft sein.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
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
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
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
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
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8
D Interface namen bekommen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben