0

件名のように: 私のクラス Java に適切な equals メソッドはありますか? Eclipse によって自動的に生成されましたが、正しく動作するかどうかはわかりませんvector.remove(pracownik)。それともEclipseで生成するのは間違っていますか?

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);
    }



}
4

2 に答える 2

2

Eclipse を使用して equals メソッドを生成することは問題ありません。オブジェクトの論理的等価性に影響する場合にのみ、フィールドが世代に含まれていることを確認することが重要です。

equals をオーバーライドする場合は、hashCode もオーバーライドする必要があります。

一般に、継承されたメソッドをオーバーライドするときは、新しいメソッドがスーパークラスに記述されている規則に準拠していることを確認する必要があります。Object hashCodeのドキュメントには、「 equals(Object) メソッドに従って 2 つのオブジェクトが等しい場合、2 つのオブジェクトのそれぞれで hashCode メソッドを呼び出すと、同じ整数結果が生成される必要がある」など、いくつかの規則が記載されています。

Object から継承した hashCode はその規則に従います - equals メソッドも Object から継承したものである場合。equals メソッドで使用すると、その規則には従いません。

Eclipse に「hashCode() と equals() の生成」を行わせると、正しく処理されます。equals メソッドを手動で記述する場合は、一致する独自の hashCode を記述する必要があります。

実際問題として、Object hashCode コントラクトに従わないクラスは、将来の再利用の罠です。HashMap や HashSet などのハッシュされたデータ構造は、hashCode メソッドが壊れている場合、実際に存在するオブジェクトを見つけられない場合があります。私が苦労して学んだ教訓の 1 つは、「これをそのように使用することは決してないだろう」に依存するのは間違いだということです。物事が進むにつれて、物事を安全に保つ方がはるかに優れています。

于 2012-11-24T22:28:10.473 に答える
0

私はこれについて専門家ではありませんが、二重等号は変数の内容ではなくアドレスを比較していると思います。したがって、.equals() に変更できます。私が間違っている場合は、より多くの経験を持つ誰かが私を訂正してくれることを願っています。

于 2012-11-24T22:27:59.273 に答える