K čemu je v Javě prázdný String konstruktor?

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #60 kdy: 19. 09. 2012, 16:57:30 »
Diskuse byla v podstate o tom, ze pokud stejne musim vedet, ze jde o tridu String a jeji konstruktor bez parametru, a zaroven je zaruceno, ze tento konstruktor musi vratit novou instanci, ktera je obsahove shodna s konstantou prazdny retezec, tak mohu rovnou vratit konstantu prazdny retezec a na volani konstruktoru se vybodnout. Tedy by se zdalo, ze se bez tohoto konstruktoru da obejit a odtud puvodni otazka, proc tam vlastne je.
No výborně. Od odboček jsme se vrátili zpátky k tématu. Přesně kvůli tomuhle, co píšeš, nechápu, proč by ten konstruktor měl být nutný - pro String beztak potřebuju speciální zacházení, takže místo String() tam můžu dát prostě "".


kuka

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #61 kdy: 19. 09. 2012, 18:16:52 »
No výborně. Od odboček jsme se vrátili zpátky k tématu. Přesně kvůli tomuhle, co píšeš, nechápu, proč by ten konstruktor měl být nutný - pro String beztak potřebuju speciální zacházení, takže místo String() tam můžu dát prostě "".

Nikdo netvrdi, ze je ten konstruktor nutny. Na druhou stranu ma rekneme smysluplnou semantiku (zadny vstup = prazdny string), tak proc by tam nemel byt? Pro jine tridy smysluplna semantika neni, tak takovy konstruktor nemaji (napr. BigDecimal). V beznem programu se to smysluplne nepouzije, ale jestli se nekde v existujicim kodu, treba pouzivajicim reflexi, pouziva, tak proc by se to melo necim nahrazovat. Konstruktor proste dela to co ma, vetsina pouziti bude asi chyba (zbytecne vytvarim instanci, kdyz ji nepotrebuju), ale to je chyba spise jen stylu, realny dopad na vykon muze mit pouze ve specifickych pripadech.

Pavel Tisnovsky

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #62 kdy: 19. 09. 2012, 22:46:45 »
Aha, koukam, ze o generikach v jave nic nevis. Souhlasim, ze je to duvod, proc bys je nemel pouzivat.
Je to pravda, že generika v javě jsou v podstatě jenom syntaktický cukr - všechno se provádí jenom při překladu a v runtime už je všechno přeložený v podstatě stejně, jako by to bylo v době, kdy ještě generika neexistovala?

To by pak měl Ondra celkem pravdu, že to je nuda...

Ano a ne :) Ze signatur metody informace o generikach pri prekladu skutecne "zmizi". Takze napriklad void test1(List) a void test2(List<String>) budou mit shodnou signaturu. Ovsem v bajtkodu se ta informace ve skutecnosti zachova ve forme metadat (nechci tady pouzit slovo atribut, ktere ma bohuzel jiny vyznam v ceskem OOP zargonu), coz si hlida prekladac ve chvili, kdyz se nekde jinde vola mujObjekt.test1() a mujObjekt.test2(). Takze erasure zajisti jednodussi a zpetne kompatibilni volani metod - pamatujme na to, ze Java je novy COBOL :) - a na druhou stranu to zajistuje alespon nejakou typovou bezpecnost.

Co me osobne vadi vice je fakt, ze generika (resp. ty typy) nejsou kovariantni, i kdyz by podle me mohly byt :/

Pavel Tisnovsky

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #63 kdy: 19. 09. 2012, 22:49:07 »
Na rozdiel od .NETu, kde sú generiká aj v čase behu, v Jave sa rozhodli to naozaj spraviť v záujme spätnej kompatibility. To má presne dôsledky ako "nemožno spraviť new E", "nemožno sa spýtať, aký typu je prvok List<T>" a podobne, proste všetko je to v čase behu java.lang.Object. Z týchto všetkých vecí ma to až tak neotravuje, asi najdivšia vec bola nemožnosť urobiť pole generických prvkov.

Na druhou stranu je treba diky tomu implementace Clojure pro JVM mnohem snazsi nez v .NET, takze je to neco za neco :)

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #64 kdy: 20. 09. 2012, 05:28:47 »
Ovsem v bajtkodu se ta informace ve skutecnosti zachova ve forme metadat [...], coz si hlida prekladac ve chvili, kdyz se nekde jinde vola mujObjekt.test1() a mujObjekt.test2().
To je zajimava informace - o jaký přesně metadata se jedná? Jak se to správně jmenuje (abych si o tom mohl něco vygooglit)?

A dá se s těmi metadaty nějak softwarově pracovat? Když např. z nějakého zdroje dostanu obecný objekt a chci za běhu zjistit, jakého je typu, můžu nějak zjistit, jestli je to List<X> nebo List<Y>?

A jak je to s tou (obecnou) factory? Když mu předám obecný objekt, dá se vytvořit nová instance? Jde to nějak přibližně takhle?
Citace
Object neznamyObjekt = nepredvidatelnyZdrojObjektu.getNext();
Constructor[]  constructors = neznamyObjekt.getClass().getConstructors();
[...výběr bezparametrického konstruktoru...]
Object neznamyObjekt2 = constructor.newInstance();

Co me osobne vadi vice je fakt, ze generika (resp. ty typy) nejsou kovariantni, i kdyz by podle me mohly byt :/
Jak přesně se tohle projevuje? Že List<X> nemůžu předat někam, kde se očekává List? To je asi blbost že? Všechno je to za běhu List. Teď si nějak neumím představit, o co jde :)

Na druhou stranu je treba diky tomu implementace Clojure pro JVM mnohem snazsi nez v .NET, takze je to neco za neco :)
V čem přesně je snazší?

(dík za odpovědi - u většiny z nich bude stačit třeba i jenom nasměrování na článek, vhodnou google frázi nebo tak něco :)


Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #65 kdy: 20. 09. 2012, 05:31:41 »
Jak přesně se tohle projevuje? Že List<X> nemůžu předat někam, kde se očekává List? To je asi blbost že? Všechno je to za běhu List. Teď si nějak neumím představit, o co jde :)
...nebo že do metoda(List<X>) bych měl mít možnost předat parametr typu List<Y> za předpokladu, že Y je podtřída X?

Javista který umí anotace

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #66 kdy: 20. 09. 2012, 08:05:31 »
Jak přesně se tohle projevuje? Že List<X> nemůžu předat někam, kde se očekává List? To je asi blbost že? Všechno je to za běhu List. Teď si nějak neumím představit, o co jde :)
...nebo že do metoda(List<X>) bych měl mít možnost předat parametr typu List<Y> za předpokladu, že Y je podtřída X?

To jde pokud metodu deklarujete takto: metoda(List<? extends X>)

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #67 kdy: 20. 09. 2012, 08:33:18 »
To jde pokud metodu deklarujete takto: metoda(List<? extends X>)
Aha. Ale nemělo by to jít automaticky bez berliček? Není to trochu krkolomné? (silně na mě z toho vane duch C++ ;)

Javista který umí anotace

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #68 kdy: 20. 09. 2012, 09:02:31 »
To jde pokud metodu deklarujete takto: metoda(List<? extends X>)
Aha. Ale nemělo by to jít automaticky bez berliček? Není to trochu krkolomné? (silně na mě z toho vane duch C++ ;)

To není berlička ale nutnost. Nastudujte si rozdíl mezi List<? extends X> a List<? super X> a pochopíte.

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #69 kdy: 20. 09. 2012, 09:10:55 »
To není berlička ale nutnost. Nastudujte si rozdíl mezi List<? extends X> a List<? super X> a pochopíte.
Mluvím o tom, že celá tahle konstrukce se mi nelíbí. Považoval bych za normální, že Ypsilonem můžu Xko nahradit v jakémkoli kontextu bez toho, abych to někomu nějak zvlášť dával najevo.

Pavel Tisnovsky

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #70 kdy: 20. 09. 2012, 09:19:44 »
Ovsem v bajtkodu se ta informace ve skutecnosti zachova ve forme metadat [...], coz si hlida prekladac ve chvili, kdyz se nekde jinde vola mujObjekt.test1() a mujObjekt.test2().
To je zajimava informace - o jaký přesně metadata se jedná? Jak se to správně jmenuje (abych si o tom mohl něco vygooglit)?

A dá se s těmi metadaty nějak softwarově pracovat? Když např. z nějakého zdroje dostanu obecný objekt a chci za běhu zjistit, jakého je typu, můžu nějak zjistit, jestli je to List<X> nebo List<Y>?

A jak je to s tou (obecnou) factory? Když mu předám obecný objekt, dá se vytvořit nová instance? Jde to nějak přibližně takhle?
Citace
Object neznamyObjekt = nepredvidatelnyZdrojObjektu.getNext();
Constructor[]  constructors = neznamyObjekt.getClass().getConstructors();
[...výběr bezparametrického konstruktoru...]
Object neznamyObjekt2 = constructor.newInstance();

Co me osobne vadi vice je fakt, ze generika (resp. ty typy) nejsou kovariantni, i kdyz by podle me mohly byt :/
Jak přesně se tohle projevuje? Že List<X> nemůžu předat někam, kde se očekává List? To je asi blbost že? Všechno je to za běhu List. Teď si nějak neumím představit, o co jde :)

Na druhou stranu je treba diky tomu implementace Clojure pro JVM mnohem snazsi nez v .NET, takze je to neco za neco :)
V čem přesně je snazší?

(dík za odpovědi - u většiny z nich bude stačit třeba i jenom nasměrování na článek, vhodnou google frázi nebo tak něco :)

Generiky v bajtkodu:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8

Neni to uplne jednoduchy cteni, zkusim se o tom nekdy rozepsat (sam to budu muset ted nastudovat do vetsi hloubky, nez je zdravo :)


Ad kovariance: je to treba ukazano zde: http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html
Dovedu pochopit, proc to je takto navrzeno, ale z hlediska OOP (kde mame Integer extends Number a Float extends Number - dosadte si libovolnou jinou cast ze stromu hierarchiche) to cloveka nekdy prekvapi.


kuka

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #71 kdy: 20. 09. 2012, 09:31:59 »
Mluvím o tom, že celá tahle konstrukce se mi nelíbí. Považoval bych za normální, že Ypsilonem můžu Xko nahradit v jakémkoli kontextu bez toho, abych to někomu nějak zvlášť dával najevo.

Tedy bych si deklaroval List<Y> a predal ho metode, ktera pracuje s List<X>. Ta by do nej pridala instanci tridy Z (ktera je rovnez potomkem X). Potom bych postupne zpracoval prvky sveho List<Y> a volal na nich metody tridy Y. Co by se stalo, az bych narazil na instaci tridy Z? Kde by byla slibovana typova kontrola? Pro nazornost si dosadme treba X=Number, Y=BigDecimal, Z=Short.

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #72 kdy: 20. 09. 2012, 09:50:12 »
Generiky v bajtkodu:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4
http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.8

Neni to uplne jednoduchy cteni, zkusim se o tom nekdy rozepsat (sam to budu muset ted nastudovat do vetsi hloubky, nez je zdravo :)
Uff, tak to je na mě fakt moc velkej guláš, to si raději počkám na ten článek (předem díky ;)

Ad kovariance: je to treba ukazano zde: http://www.ibm.com/developerworks/java/library/j-jtp01255/index.html
Dovedu pochopit, proc to je takto navrzeno, ale z hlediska OOP (kde mame Integer extends Number a Float extends Number - dosadte si libovolnou jinou cast ze stromu hierarchiche) to cloveka nekdy prekvapi.
Jasně, tak to jsem pochopil správně. Jo, je to docela matoucí - hlavně ta nekonzistence s Array.

Medik

Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #73 kdy: 20. 09. 2012, 10:01:18 »
Aby byla třída JavaBean, musí mít i konstruktor bez parametrů, viz. http://en.wikipedia.org/wiki/JavaBeans
 ;)


Re:K čemu je v Javě prázdný String konstruktor?
« Odpověď #74 kdy: 20. 09. 2012, 10:14:10 »
Tedy bych si deklaroval List<Y> a predal ho metode, ktera pracuje s List<X>. Ta by do nej pridala instanci tridy Z (ktera je rovnez potomkem X). Potom bych postupne zpracoval prvky sveho List<Y> a volal na nich metody tridy Y. Co by se stalo, az bych narazil na instaci tridy Z? Kde by byla slibovana typova kontrola? Pro nazornost si dosadme treba X=Number, Y=BigDecimal, Z=Short.
U Array to nevadí? :)