在主题中:我的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);
}
}
答案 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()。如果我错了,我希望有更多经验的人纠正我。