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) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。”

您从 Object 继承的 hashCode 遵循该规则 - 如果 equals 方法也是从 Object 继承的方法。与您的 equals 方法一起使用时,它不遵循该规则。

如果您让 Eclipse 执行它的“生成 hashCode() 和 equals()”,它就会正确。如果手动编写equals方法,需要自己编写hashCode来匹配。

实际上,不遵循 Object hashCode 约定的类是未来重用的陷阱。散列数据结构,例如 HashMap 和 HashSet,如果 hashCode 方法损坏,可能无法找到实际存在的对象。我学到的一个教训是,依赖“我永远不会那样使用它”是错误的。随着事情的发展,最好保持事情的安全。

于 2012-11-24T22:28:10.473 回答
0

我不是这方面的专家,但我相信双等号是比较地址而不是变量的内容。因此,您可以将其更改为 .equals()。如果我错了,我希望有更多经验的人纠正我。

于 2012-11-24T22:27:59.273 回答