2012-11-24 2 views
0

제목과 마찬가지로 : 내 클래스 Java에 대해 올바른 equals 메서드입니까? 내가 이클립스에 의해 자동적으로 생성했는지 알지 못한다면 vector.remove(pracownik)이 correctrly로 동작 할 것이다. 또는 Eclipse로 생성하는 것이 잘못 되었습니까?내 클래스에 대해 올바른 equals 메서드입니까? Java

import java.util.Date; 
import java.util.Vector; 

public class Pracownik extends Osoba { 
    private String stanowisko; 
    private int pensja; 
    private Date dataZatrudnienia; 

    public Pracownik(Adres adres, String telefon, String imie, String nazwisko, 
      int id, Date dataUrodzenia, String stanowisko, int pensja, 
      Date dataZatrudnienia) { 
     super(adres, telefon, imie, nazwisko, id, dataUrodzenia); 
     this.stanowisko = stanowisko; 
     this.pensja = pensja; 
     this.dataZatrudnienia = dataZatrudnienia; 
    } 

    public String getStanowisko() { 
     return stanowisko; 
    } 

    public int getPensja() { 
     return pensja; 
    } 

    public Date getDataZatrudnienia() { 
     return dataZatrudnienia; 
    } 

    @Override 
    public String toString() { 
     return super.toString() + "\nstanowisko=" + stanowisko + "\npensja=" 
       + pensja + "\ndataZatrudnienia=" + dataZatrudnienia; 
    } 

    private static Vector<Pracownik> ekstensja = new Vector<Pracownik>();//kolekcja zawierajaca ekstensje 

    private static void dodajPracownik(Pracownik pracownik) { //metoda dodajac aobiekt do ekstensji 
     ekstensja.add(pracownik); 
    } 

    private static void usunPracownik(Pracownik pracownik) {//metoda usuwajaca obiekt z ekstensji 
     ekstensja.remove(pracownik); 
    } 



    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Pracownik other = (Pracownik) obj; 
     if (dataZatrudnienia == null) { 
      if (other.dataZatrudnienia != null) 
       return false; 
     } else if (!dataZatrudnienia.equals(other.dataZatrudnienia)) 
      return false; 
     if (pensja != other.pensja) 
      return false; 
     if (stanowisko == null) { 
      if (other.stanowisko != null) 
       return false; 
     } else if (!stanowisko.equals(other.stanowisko)) 
      return false; 
     return true; 
    } 

    private static void pokazEkstensje(){ //wyswietlenie ekstensji przy pomocy petli for each 
     System.out.println("Ekstensja klasy Pracownik"); 
     for(Pracownik pracownik: ekstensja) 
      System.out.println(pracownik); 
     System.out.println(); 
    } 

    public static void main(String[] args){ 
     Adres adres = new Adres("tara", "588 m.42", "03-422", "Warszawa"); 
     Pracownik pracownik = new Pracownik(adres, "02-6451-4564", "Ala", "Kotowa", 323, new Date(), "szef", 14000, new Date()); //tworze pracownika 
     System.out.println(pracownik);//wyswietlam pracowanika 

     //tworze stazyste 
     Stazysta stazysta = new Stazysta(adres, "3232 9898", "frajer", "costam", 3232, new Date(), "podawanie kawy", 0, new Umowa(new Date(2010,10,5), new Date(2011,11,8))); 
     //wysswietlam stazyste 
     System.out.println(stazysta); 
    } 



} 
+0

꽤 잘 보인다 ...하지만 내 꿈에서 Pracownik의 벡터가 내게 올 것이다 ... – bsiamionau

+0

오른쪽, 벡터 제거 방법은 equals()를 사용합니다. 그냥 슈퍼 필드 (Osoba)를 두려워 할 것입니다. 당신의 디자인이 adres, telefon, imie, nazwisko, id, dataUrodzenia를 고려하지 않고 중복 Pracownik 객체를 만든다면 괜찮을 것입니다. – HRgiger

답변

0

나는 이것에 대해 전문가가 아니지만, 이중 같음은 변수의 내용보다는 주소를 비교한다고 생각합니다. 따라서 이것을 .equals()로 변경할 수 있습니다. 내가 틀렸다면 훨씬 더 많은 경험을 가진 사람이 나를 바란다.

+0

그는'int' 프리미티브를 비교하기 위해'=='를 사용하고 있습니다. 이것은 잘 동작 할 것입니다. 문자열의 경우에는 작동하지 않습니다. –

+0

게다가'double'에는'equals' 메소드가 없습니다. – arshajii

2

Eclipse를 사용하여 equals 메소드를 생성하는 것이 좋습니다. 필드가 객체의 논리적 평등에 영향을주는 경우에만 필드가 생성에 포함되는지 확인하는 것이 중요합니다.

equals를 재정의하는 경우 hashCode도 대체해야합니다.

일반적으로 상속 된 메서드를 재정의 할 때 새 메서드가 수퍼 클래스에 지정된 규칙을 준수하는지 확인해야합니다. Object hashCode documentation에는 "두 개체가 equals (Object) 메서드에 따라 동일하면 두 개체 각각에서 hashCode 메서드를 호출하면 같은 정수 결과를 생성해야합니다."

Object에서 상속 한 hashCode는 해당 규칙을 따르며, equals 메서드가 Object에서 상속 된 메서드이기도합니다. equals 메소드와 함께 사용할 때이 규칙을 따르지 않습니다.

Eclipse에서 "Generate hashCode() and equals()"작업을 수행하게하면 올바르게 처리됩니다. equals 메소드를 수동으로 작성하는 경우 일치시킬 사용자 고유의 hashCode를 작성해야합니다.

사실상 Object hashCode 계약을 따르지 않는 클래스는 향후 재사용을위한 트랩입니다. HashMap 및 HashSet과 같은 해시 된 데이터 구조는 깨진 hashCode 메서드가있는 경우 실제로있는 개체를 찾지 못할 수 있습니다. 제가 어려운 방법을 배웠던 한 가지 교훈은 "나는 결코 그렇게 사용하지 않을 것"에 의존하는 실수입니다. " 사람이 따라갈 때 물건을 안전하게 지키는 것이 훨씬 낫습니다.

+0

왜 hashCode가 필요합니까? – Yoda

+0

'equals'를 무시할 때마다 항상 hashCode를 재정의해야합니다. –

+0

@RobertKilar이 문제를 해결하기 위해 편집 할 수 있습니다. –

관련 문제