2013-08-02 8 views
6

//Student.javaJak używać oryginalnego hashCode() metoda po nadrzędnymi to

class Student{ 
private int roll; 
private String name; 

    public Student(int roll,String name){ 
    this.roll=roll; 
    this.name=name; 
    } 

    public int hashCode(){ 
    return roll+name.length(); 
    } 

    public boolean equals(Object obj){ 
    Student s=(Student)obj; 
    return (this.roll==s.roll && this.name.equals(s.name)); 
    } 

} 

//IssueID.java

class IssueID{ 

    public static void issueID(Student s1,Student s2){ 

    if(s1.equals(s2)) 
    System.out.println("New ID issued"); 

    else 
    System.out.println("New ID NOT issued"); 

    } 

} 

//Institute.java

import java.lang.Object; 
class Institute{ 
    public static void main(String[] args){ 
    Student s1=new Student(38,"shiva"); 
    Student s2=new Student(45,"aditya"); 

    IssueID.issueID(s1,s2); 


    System.out.println(s1.hashCode()); 
    System.out.println(s2.hashCode()); 
    } 

} 

Jak w powyższym kodzie, zastąpiłem metodę hashCode(). To może brzmieć głupio, ale czy mogę uzyskać dostęp do metody java.lang.Object.hashCode() przy użyciu tych samych obiektów Ucznia (s1 i s2) w tym samym czasie?

+1

'super.hashCode()', ale to byłoby bezużyteczne MOIM ZDANIEM. –

Odpowiedz

17

Tak, z System.identityHashCode:

Zwraca sam kod skrótu dla danego obiektu, co będzie zwrócony przez hashcode domyślna metoda(), czy klasa danego obiektu za zastępuje hashCode().

0

Można użyć System.identityHashCode lub super.hashCode() Ponadto, należy napisać lepszy kod skrótu jak każdy studentów z sumą długości nazwy i walca jest równa będzie miał ten sam kod skrótu. Podobnie jak (9, "Bob") i (7, "Steve"). To otworzy wiele potencjalnych problemów na przyszłe błędy. Oszczędź sobie głowy i napisać coś takiego:

public int hashCode() { 
     int hash = 31 * roll; 
     hash = 31 * hash + name.hashCode(); 
     return hash; 
} 

Należy również pamiętać, że metoda equals nie spełnia metodę równi w JLS.

this.equals(null) powinien zwrócić wartość false, twoja spowoduje wyjątek ClassCastException.

Może to również prowadzić do błędów w przyszłości.

+0

tak! ta metoda hashcode służy tylko do testów. W każdym razie dzięki za Twoją sugestię! –

+1

[HashCodeBuilder] (http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/HashCodeBuilder.html) jest twoim przyjacielem! – chrylis

0

napisać coś takiego:

class Student { 
    public int originalHashCode() { 
     return super.hashCode(); 
    } 
} 

następnie wywołać s.originalHashCode(), gdy chcesz użyć oryginalnego jeden ~

Powiązane problemy