V tomto pripade by som sa zamyslel nad konkretnym praktickym prikladom
a tym, ci sa metody getA() a getB() nedaju vyriesit polymorfizmom.

Vo vasej metode doId() je problem v nerozsiritelnosti, akonahle
by pribudla trieda C (C implements Value), v metode doId() musite
dodat novu vetvu do podmienky if. V pripade polymorfizmu (t. j.
vasa metoda doInterface()) je vyhoda, ze nic take robit nemusite,
len vyrobite triedu C a prekryjete prislusnym sposobom getValue().

Inak v pripade komplexnych hierarchii tried, kde naozaj treba
pouzivat aj dedicnost, aj sa dopytovat na typ triedy, existuje
kompromis, ktory je v API pre DOM (Document Object Model):
tam existuje interfejs Node, je implementovany velkym mnozstvom tried (napr.
Element implements Node, Document implements Node).

Kazda takato trieda prekryva metodu getNodeType(), ktora vracia
jedinecne cislo zodpovedajuce typu uzla. Instancie typu Element
maju getNodeType() == 1, instancie Document-u maju getNodeType() == 9.

Takto mozno porovnanim getNodeType() v podmienke zistit typ objektu
aj inak nez cez instanceof a pretypovanie.

RN
On 27. 7. 2010 10:01, Ondra Medek wrote:
Mno jestli tady ten vykon neovlivnuje vice ta prace s ArrayList nezli
sledovane operace. Protoze je list velky, pak se projevu kesovani, GC,
apod. Spise bych zkusil male pole, ktere se alokuje jen 1x cca treba
jen 10 elementu, a to pole pak prochazet vicekrat. Anebo mit jen jeden
element?

2010/7/27 Pavel Nemec<[email protected]>:
Dobry den,
resim takovy maly problem toho co je lepsi pouzivat  pro rozliseni
typu objektu.

Ja jsem zastance pouzivat interface a nechat compilator/runtime aby si
vybral, kterou metodu zavola. Muj oponent pochazi vice z Ccka a je mu
blizsi pouzivat klice, pripadne instanceof.

Ja jsem mel vzdy za to ze instanceof je velmi pomale a nedoporucuje
se, nicmene jsem se docetl, ze to jiz davno neplati.

Udelal jsem si maly test, kdy zjistuji zda je objekt daneho typu na
zaklade volani
instanceof
interface - nezjistuji, pouze volam interface metodu
na zaklade objekt.getID()  + pretypovani.

Myslel jsem ze interface bude s prehledem nejrychlejsi, nicmene tomu
odpovida jen maly pocet volani (volam v cyklu a zjistuji jestli objekt
v listu je daneho typu)

pro 20 000 polozekinstanceof: 20000 item took 25milsec, and result is
0 (should be 0)
interface: 20000 item took 4milsec, and result is 0 (should be 0)
id:       20000 item took 23milsec, and result is 0 (should be 0)

pro vysi pocet pak rychlost interface jiz kleas a napriklad pro 20M
instanceof: 20000000 item took 284milsec, and result is 0 (should be 0)
interface: 20000000 item took 380milsec, and result is 0 (should be 0)
id:       20000000 item took 188milsec, and result is 0 (should be 0)


Zdrojak je nejednodusi mozny, viz: http://pastebin.ca/1909107

je tohle znama vec, a je tedy skutecne jedno zda(co se tyce rychlosti)
pouziji instance of misto interface?


Diky,
Pavel




Odpovedet emailem