Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

override equals() i casting ?

[es] :: Java :: override equals() i casting ?

[ Pregleda: 1478 | Odgovora: 15 ]

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tiranin
Dorćol

Član broj: 37185
Poruke: 245
..njuel-bg.customer.sbb.co.yu.



Profil

icon override equals() i casting ?14.10.2005. u 11:24

U nekoj klasi imam
Code:

MojaKlasa {
      public void equals(MojaKlasa mk){
.
.
.
}
gde vrsim poredjenja jedne instance MojaKlasa sa drugom instancom iste klase. Nista narocito, radio sam to zilion puta.
U nekoj drugoj klasi, imam java.util.Vector i u njega sam smestio instance klase MojaKlasa.
Zatim uradim npr.

Code:
...
MojaKlasa mk = (MojaKlasa) enm.nextElement();
if(mk.equals(drugaInstanca)){...}

i dogadja mi se da umesto da se izvrsava metoda equals(MojaKlasa mk) koju sam ja napravio, izvrsava se (cini mi se) metoda equals uz klase Object, i naravno vraca mi false, jer nisu u pitanje iste instance.
Tek nedavno sam presao na 1.5, nisam nikad kodirao generic-e, pa ne znam da li moram(ne da li je korisno, vec da li je obavezno), ako je uopste to razlog ovog problema.
Kada metodu equals(...) preimenujem u npr. jednako(...), sve radi OK.
Ima li negde nesto objavljeno o ovome, guglao sam ali bezuspesno ?
14.10.2005. u 11:24 

Damjan S. Vujnovic
London, UK

Član broj: 30444
Poruke: 81
*.ceetel.co.yu.

Jabber: damjan@elitesecurity.org
ICQ: 68189289
Sajt: www.javasvet.net


Profil

icon Re: override equals() i casting ?14.10.2005. u 11:33
A da ti malo prelistas neku Java 101 knjizicu i vidis kako je tacno potpis metoda equals (tip parametra i tip rezultata)?

http://java.sun.com/j2se/1.5.0...i/java/lang/Object.html#equals(java.lang.Object)

DSV

[Ovu poruku je menjao Damjan S. Vujnovic dana 14.10.2005. u 12:34 GMT+1]
I love the smell of copyright violations in the morning. Smells like... freedom!
14.10.2005. u 11:33 

tiranin
Dorćol

Član broj: 37185
Poruke: 245
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 11:38
Greska u kucanju. Naravno da mi je metoda
Code:
public boolean equals(MojaKlasa mk){

a ne
Code:
public void equals(MojaKlasa mk){

kako sam pogresno ukucao u prvom postu. To se i moglo pretpostaviti jer sam rekao da mi metoda jednako() radi ispravno, a kada se zove equals() ne radi. A podrazumeva se valjda da metoda koja nesto testira vraca boolean.
14.10.2005. u 11:38 

Damjan S. Vujnovic
London, UK

Član broj: 30444
Poruke: 81
*.ceetel.co.yu.

Jabber: damjan@elitesecurity.org
ICQ: 68189289
Sajt: www.javasvet.net


Profil

icon Re: override equals() i casting ?14.10.2005. u 11:40
Ajmo jos jednom, sad za one sa jeftinijim ulaznicama:

public boolean equals(Object obj);

DSV
I love the smell of copyright violations in the morning. Smells like... freedom!
14.10.2005. u 11:40 

logotet
Beograd

Član broj: 49849
Poruke: 42
..njuel-bg.customer.sbb.co.yu.

Sajt: www.logotet.com


Profil

icon Re: override equals() i casting ?14.10.2005. u 11:46
Idi na
www.javapractices.com/Topic17.cjp
ili
ovo
Tu ces naci objasnjenje da je uz override metode equals(), obavezno uraditi i override metode
public int hashCode()

Verujem da je to razlog.
14.10.2005. u 11:46 

tiranin
Dorćol

Član broj: 37185
Poruke: 245
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 11:53
Citat:
Damjan S. Vujnovic: Ajmo jos jednom, sad za one sa jeftinijim ulaznicama:

public boolean equals(Object obj);

DSV

Gresku sto sam ukucao void umesto boolean prihvatam, ali za ovo me bas zasmejavas :))
14.10.2005. u 11:53 

smrz
promenio bi

Član broj: 61190
Poruke: 98
82.117.193.*

Sajt: 70.84.131.212/data/toons/..


Profil

icon Re: override equals() i casting ?14.10.2005. u 12:02
Citat:
tiranin: Gresku sto sam ukucao void umesto boolean prihvatam, ali za ovo me bas zasmejavas :))


evo mi se svi smejemo zajedno sa tobom, ali - tebi.
14.10.2005. u 12:02 

kurt.hectic
Kurt Hectic

Član broj: 66049
Poruke: 25
*.etf.bg.ac.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 13:49
lepo ti covek kaze da potpis funkcije treba da ti bude public boolean equals(Object o)
a ne public boolean equals(MojaKlasa o) ali tebi ne vredi govoriti, izgleda...
14.10.2005. u 13:49 

me-tuzalem
mensur tuzalemovic
novi pazar

Član broj: 25730
Poruke: 106
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 14:03
Grešku imaš vjerovatno u nekom djelu koda koji nisi ovdje prikazao. Nema razloga da ti se izvršava Object.equals namjesto tvoje TvojaKlasa.equals, s tim što se u ovome što si prikazao ne može govoriti o overridingu več o overloadu.
Naime, kada želiš promijeniti ponašanje metode iz nasleđene klase onda moraš u potpunosti ispoštovati potpis iz "starije" klase.
Ako to ne uradiš , već samo ime metode ostane isto, a argumenti su različiti, makar bili i potklase, što je u tvom slučaju, onda je u pitanju overloading.
Ti si u pravu što očekuješ da se izvršava metoda iz tvoje klase, ako se ona izvršava kada je nazoveš "jednako", a ne uzvršava se kada je zoveš "equals" , vjerujem da imaš neki slabouočljivi bag u kodu.
Što se tiče onog komentara sa potrebom da imaš hashCode() , to je važno samo ako radiš sa određenim kolekcijama.

BTW. Nema potrebe za ciničnim prepucavanjima, ni s tvoje strane ni sa strane onih koji misle drugačije. Moderator bi mogao malo da se pozabavi ovim.
14.10.2005. u 14:03 

x VITA x
Beograd

Član broj: 41277
Poruke: 57
*.sbb.co.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 15:54
ja sam se slicno jednom zeznuo za windowClosing metodu..tacnije nisam ima window event argument.. uf koliko je trebalo da provalim :)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. - Dennis Ritchie
14.10.2005. u 15:54 

Toxter
NS

Član broj: 39393
Poruke: 246
*.ftn.ns.ac.yu.



Profil

icon Re: override equals() i casting ?14.10.2005. u 20:59
Citat:
me-tuzalem: ...u ovome što si prikazao ne može govoriti o overridingu več o overloadu...


Tacno!
Sad mu nije nista, ubio si ga k'o zeca...
14.10.2005. u 20:59 

hyle
Perica Milošević
Software Architect - Sportska kladionica Mozzart
Belgrade

Moderator
Član broj: 30030
Poruke: 134
*.dial.InfoSky.Net.

ICQ: 58111799
Sajt: www.linkedin.com/in/peric..


Profil

icon Re: override equals() i casting ?15.10.2005. u 01:45
Slažem se sa me-tuzalemom samo bih odgovorio na sledeće.

Citat:
me-tuzalem: Grešku imaš vjerovatno u nekom djelu koda koji nisi ovdje prikazao. Nema razloga da ti se izvršava Object.equals namjesto tvoje TvojaKlasa.equals


Njemu se izvršava Object.equals zbog toga što uzima elemente iz vektora, a vektor sve svoje elemente tretira kao Object i zbog toga poziva metodu te klase i ne vidi metode iz klasa koje su nasledile Object.


Inače, ova greška, kada se u metodi equals kao argument ne navede Object već neka druga klasa, je jedna od najčešćih početničkih grešaka.

Pozdrav
15.10.2005. u 01:45 

me-tuzalem
mensur tuzalemovic
novi pazar

Član broj: 25730
Poruke: 106
..njuel-bg.customer.sbb.co.yu.



Profil

icon Re: override equals() i casting ?15.10.2005. u 12:31
Citat:
hyle:
Inače, ova greška, kada se u metodi equals kao argument ne navede Object već neka druga klasa, je jedna od najčešćih početničkih grešaka.

Iako se hyle slaže sa mnom, ja se ovdje ne bih složio. Ne bih ovo smatrao početničkom greškom, možda samo lošom praksom. Potpuno je korektno uraditi overload metode equals.
Nudim par članaka:
1. http://www.ibiblio.org/javafaq/questions/07031998.html
2. http://www.idinews.com/casts.html
3.
http://www.cs.williams.edu/~kim/cs334/s00/Lectures/Lec17/Lec17.html
4. http://www.javapractices.com/Topic17.cjp
5.http://www.geocities.com/technofundo/tech/java/equalhash.html

što ipak ne znači da to treba uvijek raditi. O ovome bi mogla i da se otvori akademska rasprava. Override sa argumentom Object je po meni bolja programerska praksa, ali ni overload sa nekim drugim argumentom nije zabranjen.
Međutim, tiranin je u svom prvom postu naveo da je uradio casting kada je uzimao objekat iz Vectora. Ako jeste, onda bi trebalo da se izvrši oveloadovana metoda equals. Ako nije, onda se izvršava equals iz Object klase.
15.10.2005. u 12:31 

Au197/79
NBGD

Član broj: 3556
Poruke: 619
*.ETF.BG.AC.YU.



Profil

icon Re: override equals() i casting ?15.10.2005. u 14:53
Zato lepo javu 5 u ruke i pišite anotaciju @Override i neće biti ovakvih "bubica".
Bolje džaba ležat nego džaba radit.
15.10.2005. u 14:53 

smrz
promenio bi

Član broj: 61190
Poruke: 98
*.dialup.neobee.net.

Sajt: 70.84.131.212/data/toons/..


Profil

icon Re: override equals() i casting ?15.10.2005. u 22:44
Citat:
Tiranin:...
MojaKlasa mk = (MojaKlasa) enm.nextElement();
if(mk.equals(drugaInstanca)){...}


Citat:
me-tuzalem:
Međutim, tiranin je u svom prvom postu naveo da je uradio casting kada je uzimao objekat iz Vectora. Ako jeste, onda bi trebalo da se izvrši oveloadovana metoda equals. Ako nije, onda se izvršava equals iz Object klase.


Gde piše kako je kastovana drugaInstanca? I ona utiče na to koja metoda će biti pozvana.
15.10.2005. u 22:44 

hyle
Perica Milošević
Software Architect - Sportska kladionica Mozzart
Belgrade

Moderator
Član broj: 30030
Poruke: 134
*.dial.InfoSky.Net.

ICQ: 58111799
Sajt: www.linkedin.com/in/peric..


Profil

icon Re: override equals() i casting ?16.10.2005. u 02:52
Citat:
me-tuzalem: Potpuno je korektno uraditi overload metode equals.

Override sa argumentom Object je po meni bolja programerska praksa, ali ni overload sa nekim drugim argumentom nije zabranjen.


Metoda Object.equals(Object) je bitna zbog toga što je intenzivno koriste bazne javine klase i ljudi ih najčešće implementiraju u svojim klasa baš iz tog razloga što ih koriste u kombinaciji sa njima. Tu metodu koristi npr. HashMap prilikom stavljanja i uzimanja objekata iz mape ili na primer bilo koji Set i zbog toga je bitno da budu ispravno implementirane.
Naravno da je potpuno ispravno da napišeš svoju metodu equals koja kao argument neće primati Object već neku drugu klasu ali tu metodu neće videti HashMap ili neka druga bazna javina klasa tako da ne možeš da se oslanjaš na funkcionalnost tih klasa.
16.10.2005. u 02:52 

[es] :: Java :: override equals() i casting ?

[ Pregleda: 1478 | Odgovora: 15 ]

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.