Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Michal Štrba 10. 05. 2014, 22:10:36

Název: Jsou Java generics opravdu špatné?
Přispěvatel: Michal Štrba 10. 05. 2014, 22:10:36
Ak viete niekto sposob ako urobit toto tak, aby to nedavalo v Java error tak mi prosim povedzte.

Kód: [Vybrat]
class Foo {
    public Foo(String ohMyName) {
        // bla bla
    }
}

class SuperGeneric<F extends Foo> {
   
    void notWorkingMethod() {
        F f = new F("Chuck Norris");
    }   
   
}

Ja viem, ze je mozne dostat objekt Class<F>, a potom volat cls.newInstance(), ale tam nie su podporovane parametre konstruktoru?
Skratka, ako vytvorit objekt generickeho typu, pomocou konstruktora s parametrom/parametrami?
Pre mna to zatial vyzera tak, ze je to nemozne, a ak je to tak, tak Java generics su naozaj hlupy vtip.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Filip Jirsák 10. 05. 2014, 23:11:09
Java generiky jsou dostupné pouze kompilátoru, bajtkód se při jejich zavedení nijak neměnil. Při běhu tedy JVM o F nic neví, takže nemůže zavolat jeho konstruktor. Navíc i když se na ten kód podíváte, je nesmyslný. F je libovolný potomek Foo (nebo Foo samotné) - na jaké třídě by se tedy konstruktor měl volat? Vybrat si náhodně Foo nebo nějakého jeho potomka?

Konstruktory třídy získáte přes Class.getConstructors(), případně přes Class.getConstructor(Class<?>... parameterTypes) získáte konkrétní konstruktor.

Doporučuju nejprve si nastudovat věci, které chcete používat - programovat metodou pokus-omyl se moc nedá.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: perceptron 11. 05. 2014, 10:10:47
vas priklad sa po "type erasure" (odstraneni generik v case kompilacie) premeni na:

Kód: [Vybrat]
class Foo {
    public Foo(String ohMyName) {
        // bla bla
    }
}

class SuperGeneric {
   
    void notWorkingMethod() {
        ????????? o = new ????????("Chuck Norris");
    }   
   
}
kompilator nevie, co s vasim konstruktorom: jednak nevie urcit datovy typ a jednak vase generikum je "hocico, co dedi od Foo", co vedie k tomu, ze chcete vytvorit "novu instanciu hocicoho, co dedi od Foo".

generika nie su az tak prefikane vymyslene ako v .net, lebo sa musela zachovat spatna kompatibilita, miestami su dost sialene, ale rozhodne by som to nenazyval hlupym vtipom. chcelo by to z vasej strany lepsi priklad, lebo taketo vseobecne priklady z brucha sa mnohokrat daju urobit uplne inak.

a samozrejme, skuste hodit oko do legendarneho faqu angeliky lokotz: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Filip Jirsák 11. 05. 2014, 10:18:31
vas priklad sa po "type erasure" (odstraneni generik v case kompilacie) premeni na:

Kód: [Vybrat]
class Foo {
    public Foo(String ohMyName) {
        // bla bla
    }
}

class SuperGeneric {
   
    void notWorkingMethod() {
        ????????? o = new ????????("Chuck Norris");
    }   
   
}

To není úplně přesné, ve skutečnosti by se to přeložilo takto:

Kód: [Vybrat]
class Foo {
    public Foo(String ohMyName) {
        // bla bla
    }
}

class SuperGeneric {
   
    void notWorkingMethod() {
        Foo f = new ??????("Chuck Norris");
    }   
   
}
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: perceptron 11. 05. 2014, 12:17:08
to je pravda, vdaka za korekciu a dovzdelanie
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Michal Štrba 11. 05. 2014, 13:13:54
Konstruktory třídy získáte přes Class.getConstructors(), případně přes Class.getConstructor(Class<?>... parameterTypes) získáte konkrétní konstruktor.

Dakujem za odpoved. Vidim teda, ze sa to da, to je skvele, nie su tie generika predsa az TAKE zle. Aj ked musim explicitne poskytovat Class objekt, co je dost neohrabane.

chcelo by to z vasej strany lepsi priklad, lebo taketo vseobecne priklady z brucha sa mnohokrat daju urobit uplne inak.

Ten priklad co som uviedol je iba zjednodusenou abstrakciou realneho problemu, ktory riesim. A naozaj v nom potrebujem vytvarat nove instancie danej generickej triedy pomocou konstruktora s parametrami.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: greg 11. 05. 2014, 14:37:19
Ten priklad co som uviedol je iba zjednodusenou abstrakciou realneho problemu, ktory riesim. A naozaj v nom potrebujem vytvarat nove instancie danej generickej triedy pomocou konstruktora s parametrami.

Obavam sa, ze tym, ako to chces spravit, porusujes OOP principy. SKus to spravit tak, aby konstruktor bol vzdy bez parametrov. Vsetko, co potrebujes odovzdat danej instancii odovzdavaj cez set* metody. Takto velmi pekne vyriesis aj rozne veci, ktore ti budu sakra vadit pri robeni testov.

OS: Ako zarucene nasrat slovensky pisuceho prispievatela? No predsa otazkou: "Ve kterém měsíci proběhla sametová revoluce?"
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Filip Jirsák 11. 05. 2014, 14:47:02
Obavam sa, ze tym, ako to chces spravit, porusujes OOP principy. SKus to spravit tak, aby konstruktor bol vzdy bez parametrov. Vsetko, co potrebujes odovzdat danej instancii odovzdavaj cez set* metody. Takto velmi pekne vyriesis aj rozne veci, ktore ti budu sakra vadit pri robeni testov.
Já tenhle přístup naopak nemám rád. Pokud se nějaká hodnota nastavuje jenom při inicializaci objektu, dám field final a nastavuju ho v konstruktoru. Podle mne by měl být po provedení konstruktoru objekt plně inicializovaný a připravený k použití, ne že musím zjišťovat, co vše je ještě nutné nastavit.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Michal Štrba 11. 05. 2014, 14:53:29
Obavam sa, ze tym, ako to chces spravit, porusujes OOP principy. SKus to spravit tak, aby konstruktor bol vzdy bez parametrov. Vsetko, co potrebujes odovzdat danej instancii odovzdavaj cez set* metody. Takto velmi pekne vyriesis aj rozne veci, ktore ti budu sakra vadit pri robeni testov.
Já tenhle přístup naopak nemám rád. Pokud se nějaká hodnota nastavuje jenom při inicializaci objektu, dám field final a nastavuju ho v konstruktoru. Podle mne by měl být po provedení konstruktoru objekt plně inicializovaný a připravený k použití, ne že musím zjišťovat, co vše je ještě nutné nastavit.

Uplne suhlasim. Ja aj namiesto:

public void setFoo(float value) {
    this.foo = value;
}

public float getFoo() {
    return foo;
}


Davam proste public float foo;
Ak to niekto povazuje za porusenie OOP principov, tak nech mi povie, v com sa public field lisi od hore uvedenych getterov a setterov.

Aj ked uvedomil som si, ze v mojom pripade mozem do danej triedy pridat aj default konstuktor, ktory proste nastavi defaultne hodnoty, pretoze tie su neskor zmenitelne.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Filip Jirsák 11. 05. 2014, 15:06:39
Ak to niekto povazuje za porusenie OOP principov, tak nech mi povie, v com sa public field lisi od hore uvedenych getterov a setterov.
Rozdíl je v tom, že při použití getterů a setterů můžete změnit implementaci, aniž byste změnil kontrakt. Např. můžete do setteru později přidat odpálení události propertyChange.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Kit 11. 05. 2014, 15:31:06
Davam proste public float foo;
Ak to niekto povazuje za porusenie OOP principov, tak nech mi povie, v com sa public field lisi od hore uvedenych getterov a setterov.
Špatně je obojí. Vznikají tím anemické modely, které mají zbytečně košaté rozhraní a přitom nic neumí.
Aj ked uvedomil som si, ze v mojom pripade mozem do danej triedy pridat aj default konstuktor, ktory proste nastavi defaultne hodnoty, pretoze tie su neskor zmenitelne.
Defaultní hodnoty je zbytečné dávat do konstruktoru. Atributy je možné nastavit v deklaraci, je to také mnohem přehlednější.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: perceptron 11. 05. 2014, 15:33:41
dodanie parametra typu Class je bezna praktika (nazvite si to workaround ak chcete), v springu sa pouziva bezne

to, ci trieda musi mat vsetky zavislosti / veci potrebne pre beh uz v konstruktore, alebo dodatocne, je otazka konvencii a konkretneho, oba maju pre a proti. taky zmieneny spring pouziva settery a anotaciu (@postconstruct, initializingbean), ine frameworky pchaju vsetko do konstruktora. opticky mam pocit, ze java pouziva skor settery a gettery, ... lebo tradicia.

v kazdom pripade, public premenne su grc. pythonisti maju na to oznacenie "unpythonic", ak chcete

Citace
Ak to niekto povazuje za porusenie OOP principov

lebo ked nahodou potrebujete pri nastaveni premennej dodat dalsie operacie (napr. zalogovat), mate smolu
okrem toho milion frameworkov vie pracovat s gettrami a settrami (javabeans konvencie) a su nervozne, ked nenajdu gettery a settery
okrem toho, triedy su definovane metodami a nie stavom (kontrakt, ako povedal p. Jirsak). zial, java nema properties ako groovy, javascript ci c#, tak sa to riesi prave takto, ale principialne si na to velmi rychlo zvyknete (kazde ide vam ich vygeneruje)


Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Ziktofel 11. 05. 2014, 15:56:25
co takhle pridat factory:

Kód: [Vybrat]
public interface myFactory<F extends Foo>{
F newInstance(Object... args);
}
Misto "Object... args" dej svoje argumenty

a v ty metode si objekt vyzadat od factory. Jednou jsem v enumu reflexi predelal prave na factory, aby to bylo cistejsi a i lepe citelne, timto figlem se vtyvareji tovarni metody, ktere musi mit urcitou signaturu
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: Natix 11. 05. 2014, 18:34:06
Public fieldy kromě toho, že neumožňují abstrakci přímo v dané třídě (tzn. nemůžu přidat logování, validaci, delegaci, nebo cokoliv jiného do setteru), tak navíc ani nejsou virtuální, takže je nemůžu ani overridovat v potomkovi. Public fieldy nebrat.
Název: Re:Su Java generics naozaj az taketo zle?
Přispěvatel: greg 11. 05. 2014, 20:56:59
Dalsi problem nastavovania niecoho v konstruktory stylom, ze spravim novy objekt s ktorym mam pracovat je problem toho, ze si napriklad vysvorim vlastnu instanciu spominaneho F v konstruktore, ale pouzivatel chce znovupouzitelnost a chce moju triedu pouzit s triedou FmojeVlastneKrajsieAkoPouzilANahardkodilOn. Uz instanciu tejto triedy ale dany clovek s tvojim kodom nepouzije, lebo ty si vytvaras instanciu sam v konstruktore... Jedine oddedit tvoju triedu a overrajdnut tvoj konstruktor. Ale naco niekomu pridavat pracu, ked mozes spravit defolt konstruktor, kde si vytvor co chces, ale nasledne vytvor i konstruktor (alebo setter), kde si mozem ako pouzivatel tvojeho kodu dat cokolvek, co dedi od F (ked uz to generikum chces pouzit).
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ziktofel 11. 05. 2014, 22:34:04
Ma tam u instanci vytvorit prave pomoci ty moji factorky a po uzivatli tridy chtit, aby dodal tu factory (napriklad pridat ji mezi parametry metody. V tomto pripade ta factory obali kontruktor/statickou tovarnu/whatever tak, abych uvnitr ty metody moh ze Stringu ziskat objekt. V nejjednodussim pripade ta factory, co uzivatel doda bude lambda obaleni konstruktoru s argumentem typu String. Klient jiz konstruktor muz pouzit primo, nebot vi, co je F za konkretni tridu zac, nebo udelat tu prasarnu s reflexi konstruktoru, ale v tom pripade neni jiz zodpovednost na tobe, ale na nem.

AD public field: Rozhodne to nedelat. Pokud chces pri get/set pridat nejakou dalsi akci, tak automaticky rozbijes API, pres gettery/settery si muzu na pozadi delat co chci, aniz bych rozbil API (tzn klientsky kod se nemusi prizpusobovat moji zmene), navic u get je casto ta promenna virtualni (v dane tride vubec neexistuje). Rozumny IDE (napr. Eclipse) vygeneruje vsechny gettery/settery za programatora, takze argument lenosti zde postrada smysl (a zanechava spousty problemu). Zde bych i stouralum poradil jednu vec: piste kod, kterej se dobre cte a upravuje a nevymejslejte optimalizacni hovadiny, od toho tu mame prekladac
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: eMko 12. 05. 2014, 07:10:32
Ten ale nedokáže provést inline optimalizaci u virtuálních metod.

"Rozhodně to nedělat" bych rozhodně neříkal - spíš "dělat co nejméně, tam, kde to má smysl".

Stejně tak kód, který se dobře čte - to často znamená krátký kód.
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: greg 12. 05. 2014, 08:36:27
getery/settery, zabudol som, ze toto je vcelku pekne a este to o kusok znizuje potrebu pisat/nechat ide generovat veci: http://projectlombok.org. Podporuje i maven (bez neho neviem zit) a ma par peknych veci, ako napriklad moznost vygenerovat "rozumnu" toString() metodu (primarne pre "datove struktury").
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Kolemjdoucí 12. 05. 2014, 09:47:14
Ten ale nedokáže provést inline optimalizaci u virtuálních metod.

V Javě jsou kompilátory dva - první kompiluje ze zdrojového kódu do bajtkódu, ten to skutečně nedokáže. Druhý (nepovinný) kompiluje z bajtkódu do strojového kódu (JIT) a tam bych si tak jistý nebyl...
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ziktofel 12. 05. 2014, 11:56:11
AFAIK cilem JIT je optimalizace prave pro cilovou platformu
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: eMko 12. 05. 2014, 12:16:56
JIT virtuální metody taky AFAIK neoptimalizuje.
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Kolemjdoucí 12. 05. 2014, 12:43:18
JIT virtuální metody taky AFAIK neoptimalizuje.

To je velmi silné tvrzení, protože pro JIT kompilaci neexistuje žádná specifikace takže se taková věc obecně říct nedá - dá se mluvit pouze o konkrétních implementacích. Například tady je popsaná implementace která volání vituálních metod optimalizuje: http://wasdynacache.blogspot.cz/2012/04/ibm-j9-jit-inlining-of-virtual-methods.html
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: noef 12. 05. 2014, 17:06:28
Jen pro zajimavost posilam priklad, jak se to da resit ve Scale (take bezi nad JVM, nekdy oznacovana jako nastupce Javy). Je to Scala script (proto asi ten neocekavany konstruktor a jmena trid). Predpokladam, ze napr. v C# to pujde resit mnohem hezceji a intuitivneji.

Kód: [Vybrat]
object Main {

  import scala.reflect._

  class Foo(ohMyName: String) {
    println(s"${getClass.getSimpleName} - $ohMyName")
  }

  class Baz(p: String) extends Foo(p)

  class SuperGeneric[F <: Foo: ClassTag] {
    val tag = classTag[F]

    def notWorkingMethod() {
      val f = tag.runtimeClass.getConstructors()(0).newInstance(Main, "win!").asInstanceOf[F]
    }
  }

  def main {
    new SuperGeneric[Foo].notWorkingMethod()
    new SuperGeneric[Baz].notWorkingMethod()
  }

}

Main.main

Kód: [Vybrat]
bash-3.1$ scala genericsNewInstace.scala
anon$1$Main$Foo - win!
anon$1$Main$Baz - win!
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Natix 12. 05. 2014, 18:01:46
Jen pro zajimavost posilam priklad, jak se to da resit ve Scale (take bezi nad JVM, nekdy oznacovana jako nastupce Javy). Je to Scala script (proto asi ten neocekavany konstruktor a jmena trid). Predpokladam, ze napr. v C# to pujde resit mnohem hezceji a intuitivneji.

Kód: [Vybrat]
object Main {

  import scala.reflect._

  class Foo(ohMyName: String) {
    println(s"${getClass.getSimpleName} - $ohMyName")
  }

  class Baz(p: String) extends Foo(p)

  class SuperGeneric[F <: Foo: ClassTag] {
    val tag = classTag[F]

    def notWorkingMethod() {
      val f = tag.runtimeClass.getConstructors()(0).newInstance(Main, "win!").asInstanceOf[F]
    }
  }

  def main {
    new SuperGeneric[Foo].notWorkingMethod()
    new SuperGeneric[Baz].notWorkingMethod()
  }

}

Main.main

Kód: [Vybrat]
bash-3.1$ scala genericsNewInstace.scala
anon$1$Main$Foo - win!
anon$1$Main$Baz - win!

To je ale pořád jenom trocha syntaktického cukru nad tím, kdybys v Javě udělal:

Kód: [Vybrat]
new SuperGeneric(Foo.class).notWorkingMethod();
new SuperGeneric(Baz.class).notWorkingMethod();
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: noef 12. 05. 2014, 21:24:51
To je ale pořád jenom trocha syntaktického cukru nad tím, kdybys v Javě udělal:

Kód: [Vybrat]
new SuperGeneric(Foo.class).notWorkingMethod();
new SuperGeneric(Baz.class).notWorkingMethod();

Jiste, to nepopiram. Jen si myslim, ze ve Scale to pujde o trochu lepe zapsat a i udrzovat. Btw nema to byt spis new SuperGeneric<Foo>(Foo.class).notWorkingMethod(); nebo neco podobneho?
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ziktofel 12. 05. 2014, 22:29:18
No, furt je tam ta smradlava reflexe, proste neohlidas, ze si nekdo udela vlastniho potomka Foo, kterej nebude mit konstruktor s jednim paramterem typu String, kteryho bude chtit tu pouzit. Proto bych dal jako argument metody factorku, ktera tu reflexi udela za tebe
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: DK 12. 05. 2014, 22:33:52
To je ale pořád jenom trocha syntaktického cukru nad tím, kdybys v Javě udělal:

Kód: [Vybrat]
new SuperGeneric(Foo.class).notWorkingMethod();
new SuperGeneric(Baz.class).notWorkingMethod();

Jiste, to nepopiram. Jen si myslim, ze ve Scale to pujde o trochu lepe zapsat a i udrzovat. Btw nema to byt spis new SuperGeneric<Foo>(Foo.class).notWorkingMethod(); nebo neco podobneho?

Nutne to neni, pokud chceme zajistit, ze vratime vazne instanci dane tridy, tak to muzeme dat, jinak neni treba parametrizovat... SuperGeneric je normalni trida, ktere predas v konstruktoru nazev tridy, ze ktere vytvorit instanci... zapis bude temer identicky jako ten ve scale (dokonce bude i o trochu vice citelnejsi), na pretypovani se pouzije class.cast(instance) misto instanceOf, dokonce i vyber toho konstruktoru bude jednodussi, pokud predem vite parametry
Kód: [Vybrat]
myclass.getConstructor(String.class).newInstance("win!");
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: noef 12. 05. 2014, 23:14:41
@Ziktofel: jn, ja se snazil akorat prepsat bez uprav reseni do Scaly.

@DK: ono v podstate stejne to jde zapsat i ve Scale, akorat protoze jsem experimentoval s podobou konstruktoru (magie u Scala scriptu), tak jsem tam nechal to ziskavani vsech konstruktoru misto konkretniho.

popravde, kdyz se divam na dotaz, tak si nemyslim ze odpoved s predavanim Class to splnuje. dotaz je, jak z gen. parametru udelat instanci - a to asi v Jave primo nejde.
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ziktofel 13. 05. 2014, 00:27:24
noef: ja se snazim reflexi, pokud je to mozne vyhnot, protoze je jednak pomala a jednak vede k rade mnozstvi chyb: v tomto pripade si fakt kdokoliv muze udelat vlastniho potomka Foo bez patricneho konstruktoru a pak se bude divit, proc to pada
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Natix 13. 05. 2014, 00:32:36
Taky jsem pro přístup s předáním factory do konstruktoru, reflexí zahazujete statickou typovou bezpečnost do háje a vynucováním defaultních kontruktorů, setterů a mutability se kód stává akorát náchylnějším k chybám. S Javou 8 to už jde poměrně pěkně:

Kód: [Vybrat]
class Foo {}

class Boo extends Foo {}

class SuperGeneric<F extends Foo> {

    private final Supplier<F> supplier;

    SuperGeneric(Supplier<F> supplier) {
        this.supplier = supplier;
    }
   
    void notWorkingMethod() {
        F f = supplier.get();
    }
}

A pak jde instancovat pomocí lambda výrazu:
Kód: [Vybrat]
SuperGeneric<Boo> s = new SuperGeneric<>(() -> new Boo());
Anebo pomocí reference na metodu:
Kód: [Vybrat]
SuperGeneric<Boo> s = new SuperGeneric<>(Boo::new);
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: noef 13. 05. 2014, 08:40:29
noef: ja se snazim reflexi, pokud je to mozne vyhnot, protoze je jednak pomala a jednak vede k rade mnozstvi chyb: v tomto pripade si fakt kdokoliv muze udelat vlastniho potomka Foo bez patricneho konstruktoru a pak se bude divit, proc to pada
souhlasim s tim, ze v tomto pripade jsou mnohem elegantnejsi reseni.

ale s obecnym tvrzenim "reflexe je pomala" nesouhlasim - kdysi jsem si to zkousel a nektere pristupy z toho nevysly spatne (http://monnef.tk/blog/development/benchmark-of-reflection-in-java/). reflexe muze byt nejvhodnejsim nastrojem (a v nekterych pripadech jedinnym [napr. modovani Minecraftu, s tim jsem si fakt uzil], pokud nebereme v uvahu zmenu bytekodu za behu).

@Natix: ta osmicka vypada fakt dobre, dotahuje Scalu :).
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ladislav Thon 13. 05. 2014, 13:28:53
JIT virtuální metody taky AFAIK neoptimalizuje.

CHA (class hierarchy analysis), PIC (polymorfní inline cache) nebo inlinování metod jsou úplně běžné optimalizace. Jestli si někdo myslí, že volání metod je v Javě pomalé, žije někde v době Javy 1.2.
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: Ziktofel 13. 05. 2014, 14:00:17
noef: ja se snazim reflexi, pokud je to mozne vyhnot, protoze je jednak pomala a jednak vede k rade mnozstvi chyb: v tomto pripade si fakt kdokoliv muze udelat vlastniho potomka Foo bez patricneho konstruktoru a pak se bude divit, proc to pada
souhlasim s tim, ze v tomto pripade jsou mnohem elegantnejsi reseni.

ale s obecnym tvrzenim "reflexe je pomala" nesouhlasim - kdysi jsem si to zkousel a nektere pristupy z toho nevysly spatne (http://monnef.tk/blog/development/benchmark-of-reflection-in-java/). reflexe muze byt nejvhodnejsim nastrojem (a v nekterych pripadech jedinnym [napr. modovani Minecraftu, s tim jsem si fakt uzil], pokud nebereme v uvahu zmenu bytekodu za behu).
Nerikam, ze reflexe nema svoje vyuziti, ale obvykle je lepsi se ji pokud mozno vyhnout (tedy zvlast v tomto pripade)
Název: Re:Jsou Java generics opravdu špatné?
Přispěvatel: eMko 13. 05. 2014, 14:52:26
@Natix: ta osmicka vypada fakt dobre, dotahuje Scalu :).

Ale velmi velmi pomalu