[ anon315 @ 09.03.2008. 13:12 ] @
Aj da malo popricamo o tome kako implementirate equals metodu u domain modelu :) 1) Jasno je da nema logike testirati kolekcije. Medjutim, sta ako imam situaciju da A ima mapirano B kao kolekciju komponenti. Dakle, A je odgovoran za zivotni ciklus B, iako B ima svoju tabelu. Takodje, smatram da su mi A1 i A2 jednaki ako imaju isti set B. Jednostavno ako ne poredim ta dva seta, nisam siguran da su mi A1 i A2 isti. U ovoj situaciji sam ukljucio poredjenje setova u equals, sto smatram da nije problem, jer mi setovi ne sadrze objekat A, tako da nemam rizik od cirkulacije i stack overflowa. Kako vi resavate ovaj problem? 2) Preporuka je da se prepozna business key i da se samo polja koja ga cine testiraju. Medjutim, postoje situacije kada jednostavno sva polja moram da testiram. Na primer, ne postoji nikakav unique constraint u toj tabeli itd. Tada ukljucujem sva polja. Vi? 3) Sta sa podklasama? Code: // Nadklasa X public boolean equals(Object o) { if(this == o) { return true; } if(o == null || getClass() != o.getClass()) { return false; } final X x = (X)o; // Provere return true; Code: // Podklasa Y (Y extends X) public boolean equals(Object o) { if(!super.equals(o)) { return false; } final Y y = (Y)o; // Provere polja iz Y return true; } Citam (vezano za Hibernate) da u 99% slucajeva nije korektno da se u podklasi ukljuce nova polja za testiranje zato sto je, navodno, tesko zadovoljiti i simetricnost i tranzitivnost i zato sto business key mozda ne odgovara dobro definisanom kandidat prirodnom kljucu u DB (podklase su mi mapirane na nove tabele). A jednostavno smatram da je Y1 isto kao i Y2 ako i samo ako su im i novo dodata polja (u odnosu na nadklasu) ista. Kako vi radite? 4) Sad jedna protivrecnost. Do sada sam poredio direktno instance varijable u equals metodama zato sto zelim da testiram pravu vrednost varijable, a ne (mozda) nesto sto je nastalo dodatnim ponasanjem kroz geter (na primer default vrednost ako je varijabla null i slicno). Ovo je dobra praksa. Medjutim kada se uzme u obzir Hibernate, ovde se stvari menjaju jer je moguce da je argument koji je predat equals metodi ustvari proxy objekat, a ne instanca objekta koja ima perzistentno stanje. U ovom slucaju mora da se ide kroz geter da bi se proxy inicijalizovao. Kakva su vam ovde iskustva i praksa? V |