JUnit Test und HashCode

werdas34

Bekanntes Mitglied
Hallo,

ich habe als Aufgabe bekommen, ein paar Klassen zu programmieren und diese mit vorgebenen JUnit Test zu testen. Jetzt ist meine Frage wie?
Ich habe einen Ordner und drei .java Dateien. In unseren Skript hies es einfach in die IDE einfügen. Das funktioniert nicht so ganz. Arbeite mit Eclipse. Oder muss man die anderweitig ausführen?

Und zu hashCode. Ich weiß wofür sie da sind und was sie so essentiell macht.
Aber ich weiß nicht genau wie ich selbst eine solche Methode schreibe.
Was ich weiß. Ich brauche eine Primzahl und als Ergebnis eine bei neuen Objekten eindeutige Nummer.
Da es gewisse Java Regeln gibt frage ich hier:
Alles was ich im Internet finde sieht hashCode von anderen Objekten mit ein.
Ich habe aber abstract-Klasse und kein Objekt das irgenwie mitspielt.

Stelle mir das irgendwie so vor:
Code:
int hashCode(){
    int prim = 17;
    int result = 1;

    result = prim*3+result;
    result = result*prim+2;
}
Hoffe ihr wisst was ich meine.

mfg werdas34
 

mrBrown

Super-Moderator
Mitarbeiter
Aber ich weiß nicht genau wie ich selbst eine solche Methode schreibe.
Was ich weiß. Ich brauche eine Primzahl und als Ergebnis eine bei neuen Objekten eindeutige Nummer.
Da es gewisse Java Regeln gibt frage ich hier:
Alles was ich im Internet finde sieht hashCode von anderen Objekten mit ein.
Ich habe aber abstract-Klasse und kein Objekt das irgenwie mitspielt.

Stelle mir das irgendwie so vor:

Deine gezeigte hashCode in in jedem Fall sinnlos - sie gibt für jedes Objekt den gleiche Wert zurück, man könnte also auch einfach return 86 hinschreiben.


Generell muss jedes relevante Feld deines Objekts mit einbezogen werden (jedes, welches auch in equals benutzt wird). Wenn deine abstrakte Klasse keine Felder hat, kannst du auch hashCode nicht sinnvoll überschreiben.

Josh Bloch hat das ganze recht einfach zusammengefasst:

1. result mit dem hashCode des ersten relevante Feldes initialisieren
* Wenn es ein Objekt ist: Object.hashCode() nutzen
* Wenn es ein primitiver Typ/Array ist: Type.hashCode(value) nutzen (für int z.B: Integer.hashCode(value))​
2. für jedes weitere Feld, dessen Hashcode c berechnen und nach result = 31* result + c mit dem bisherigen verknüpfen.
 

Blender3D

Top Contributor
int hashCode(){
int prim = 17;
int result = 1;

result = prim*3+result;
result = result*prim+2;
}
Die Funktion liefert einen konstanten Wert und ist somit keine Hashfunktion.
Ziel einer Hashfunktion ist es unter Anderem anhand eines Objekt ein Wert zu berechnen um dieses schnell identifizieren zu können. Ein wichtiges Kriterium dabei ist es Kollisionen zu vermeiden.
Java:
int hash(  int key ){  return key % 3 ;}
So etwas ist ungeeignet, da alles auf 0,1,3 abgebildet wird.
z.B. könnte man so etwas schreiben.
Java:
public static int hash(String key) {
        int hash = key.length();
        for (int i = 0; i < key.length(); i++)
            hash = ((hash << 5) ^ (hash >> 27)) ^ (int) key.charAt(i);
        return hash;
    }
 

werdas34

Bekanntes Mitglied
Java:
public interface Room{
/**Liefert die Adresse des Raumes.
* @return the address
*/
public String getAddress();
/**Liefert die Nummer des Raumes.
* @return the roomNumber
*/
public String getNumber();
}

Alle konkreten Klassen für Räume brauchen die gleichen Objektvariablen und den gleichen Code für die Getter des Interface.
Definieren Sie eine abstrakte Klasse BaseRoom, die das Interface implementiert. Wählen Sie
angemessene Modifier für den Konstruktor.
Definieren Sie die Methoden equals und hashCode.


Das ist der Teil mit dem HashCode. Sagt mir bitte wie ich da das machen soll?
Ich weiß, das mein Beipiel nicht so schlau war. hätte irgendwo noch eine statische Variable gebraucht.
 

Blender3D

Top Contributor
Java:
public class BaseRoom implements Room {
    private String address;
    private String number;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BaseRoom other = (BaseRoom) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }

    @Override
    public String getAddress() {
        return address;
    }

    @Override
    public String getNumber() {
        return number;
    }

}

Könnte so aussehen. :rolleyes:;)
 

Javinner

Top Contributor
werdas34 hat gesagt.:
Das ist der Teil mit dem HashCode. Sagt mir bitte wie ich da das machen soll?
Das hier ist das Beste, was ich je zum Thema HashCode lass!
Als Tipp: erstelle eine Klasse X, ganz zwanglos. Vergebe zwei Attribute für die Klasse, als Beispiel String und int. Implementiere die Methode equals(Object obj), dann kannst du die IDE deiner Wahl dazu auffordern, die hashCode-Methode für dich erstellen zu lassen. Dann kommst du auch dahinter, was @Blender3D gemeint hat.

edit: zu spät :)
 

mrBrown

Super-Moderator
Mitarbeiter
Das hier ist das Beste, was ich je zum Thema HashCode lass!
Ich persönlich finde die Implementierung von Bloch aus dem aktuellem Effective Java deutlich besser, zur Erklärung ist das aber super ;)
Das von dir genannte Beispiel sieht auch älter als Java 8 aus, da sind einige neue nützliche Methoden hinzugekommen.
Der Unterscheid ist da im wesentlichen: result = result * 31 +(int)(field>>>32); result = result * 31 + (int)(field & 0xFFFFFFFF) vs result = result * 32 + Long.hashCode(field);

Könnte so aussehen. :rolleyes:;)
Wie praktisch, dass man Aufgaben nicht mehr selbst machen muss...
 
Zuletzt bearbeitet:

werdas34

Bekanntes Mitglied
Java:
public class BaseRoom implements Room {
    private String address;
    private String number;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        BaseRoom other = (BaseRoom) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (number == null) {
            if (other.number != null)
                return false;
        } else if (!number.equals(other.number))
            return false;
        return true;
    }

    @Override
    public String getAddress() {
        return address;
    }

    @Override
    public String getNumber() {
        return number;
    }

}

Könnte so aussehen. :rolleyes:;)
Ok. Danke. Jetzt verstehe ich das auch.
Aber jetzt noch zwei Fragen:
Werden immer alle Objektvariablen zur Berechnung mit einbezogen? Also wenn ich 20 Objektvariablen habe dann eben auch 20 Berechnungen?
Und wenn ich jetzt eine konkrete Klasse habe, die von BaseRoom erbt. Ändert sich da am Design von HashCode was? Spielt der hashCode der BaseRoom eine Rolle?
 

mrBrown

Super-Moderator
Mitarbeiter
Werden immer alle Objektvariablen zur Berechnung mit einbezogen? Also wenn ich 20 Objektvariablen habe dann eben auch 20 Berechnungen?
Alle die Felder, die relevant für die "Identität" des Objekte sind (im Idealfall auch nur die, die sich nie ändern).

Und wenn ich jetzt eine konkrete Klasse habe, die von BaseRoom erbt. Ändert sich da am Design von HashCode was? Spielt der hashCode der BaseRoom eine Rolle?
Wenn es nötig ist, den zu überschreiben (zB, weil relevante Felder hinzukommen), muss man das entsprechend überschreiben.
hashCode der super-Klasse spielt dann eine Rolle, wenn sie nicht überschrieben ist, oder wenn man sie beim überschreiben explizit aufruft (zB, wenn ein weiteres Feld betrachtet werden muss, dann ruft man erst die super-Methode auf, und verknüpft das Ergebnis mit dem einem Feld)
 

Javinner

Top Contributor
@mrBrown
Jepp, das stimmt, aus dem Jahre 2002 :D Verlieh mir jedoch die Machete für mein intellektuelles Dickicht!
Es scheint ein sehr gutes Buch zu sein, laut Amazon 5 Sterne.. Das habe ich bis jetzt noch nicht gesehen, ist es wirklich so gut? Bis jetzt kann ich es von keinem Buch behaupten, mich über die Länge zu 100% mitgenommen zu haben.
 

mrBrown

Super-Moderator
Mitarbeiter
Es scheint ein sehr gutes Buch zu sein, laut Amazon 5 Sterne.. Das habe ich bis jetzt noch nicht gesehen, ist es wirklich so gut? Bis jetzt kann ich es von keinem Buch behaupten, mich über die Länge zu 100% mitgenommen zu haben.
Ich würde es vorbehaltlos empfehlen, alles was drin steht, sollte man als Java-Entwicker irgendwann mal gelesen haben. Es ist aber eher nichts, was man am Stück lesen würde.

(wenn man einfach mal nach "effective java pdf" googlet, findet man "bestimmt" eine ältere Ausgabe als PDF, da kann man mal reinschnuppern ;) )
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
T JUnit test failed Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
J JUnit Test Java Basics - Anfänger-Themen 2
Houly JUnit Test Suite anlegen Java Basics - Anfänger-Themen 6
pun Junit Test erkennt Exception nicht.. Java Basics - Anfänger-Themen 14
G BlueJ jUnit Test Java Basics - Anfänger-Themen 6
V Test mit JUnit verbinden Java Basics - Anfänger-Themen 3
B JUnit Test Klasse Rational Java Basics - Anfänger-Themen 12
C Unsupported major.minor bei jUnit Test Java Basics - Anfänger-Themen 2
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
A JUnit testing is inkonsistent Java Basics - Anfänger-Themen 12
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
W JUnit Tests Java Basics - Anfänger-Themen 4
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
L JUnit tests in java Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
V JUnit Klassen Java Basics - Anfänger-Themen 3
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
X JUnit testing Java Basics - Anfänger-Themen 7
T JUnit Suite frage Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
T Junit --Exception testen Java Basics - Anfänger-Themen 15
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
M JUnit - nur Failures loggen? Java Basics - Anfänger-Themen 2
R String Replace für JUnit Java Basics - Anfänger-Themen 19
T JUNIT Nullpointerexception Java Basics - Anfänger-Themen 3
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
W Mit jUnit Array testen? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben