对于我的Java类来说,它是否正确等于方法

时间:2012-11-24 22:23:00

标签: java equals

在主题中:我的Java类是否正确等于方法?我已经由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);
    }



}

2 个答案:

答案 0 :(得分:2)

使用Eclipse生成equals方法很好。当且仅当它影响对象的逻辑相等时,确保字段包含在生成中是很重要的。

当你重写equals时,你也应该覆盖hashCode。

通常,在重写继承方法时,您需要确保新方法符合超类中规定的任何规则。 Object hashCode documentation声明了几条规则,包括“如果两个对象根据equals(Object)方法相等,那么在两个对象中的每一个上调用hashCode方法必须产生相同的整数结果。”

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

如果你让Eclipse执行它的“生成hashCode()和equals()”的事情,那么它将是正确的。如果手动编写equals方法,则需要编写自己的hashCode以匹配。

实际上,不遵循Object hashCode契约的类是未来重用的陷阱。散列数据结构(如HashMap和HashSet)可能无法找到实际存在的对象(如果它具有损坏的hashCode方法)。我从中学到的一个教训是依靠“我永远不会这样使用它”是一个错误。随着时间的推移,保持安全是更好的。

答案 1 :(得分:0)

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