tifyty

pure Java, what else ?

Java 8 teszt

Az új nyolcas java-ban sok minden egyéb mellett a következőt lehet állítani:

Ha egy C osztály implementál egy I interfészt, és I-ben van egy absztrakt metódus, amit C nem implementál, akkor C nem fordul le, de futni azért még futhat.

Az állítás eleje igaz volt eddig is, de a kövérrel szedett rész az új. Ha lesz időm a hétvégén kipróbálom, és megírom, hogy hogyan is kell ezt érteni. Addig is lehet kommentekben tippelni.

12 responses to “Java 8 teszt

  1. kavai március 19, 2014 12:08 du.

    Szia! Ez nagyon érdekes. Van esetleg egy linked specifikációra vagy más doksira erről?

    • Peter Verhas március 19, 2014 12:13 du.

      http://docs.oracle.com/javase/specs/

      Mondjuk ez így elég passzív agresszívnak tűnik részemről, de nem tudom, hogy tényleg nem ez hiányzik-e, többet meg most még nem súgok: ne vegyük el a többiek örömét. (Statisztikát csak a látogatók számáról látok, az örömre csak abból tudok következtetni, hogy az nem csökken.)

      Nagyon kellemes az a jls PDF verzió, amelyik a Java 7, és 8 közötti különbséget mutatja.

  2. Böszörményi Péter március 19, 2014 12:40 du.

    Ooo, lehet, hogy en ertek valamit felre, de szerintem ez eddig is igy volt. Ha pl jdbc4 ala bedugtal egy jdbc3-at implementalo drivert, akkor az osszes olyan metodus mukodott, ami implementalva volt, a nem implementaltak hivasanal a jvm szorgalmasan dobalta a java.lang.AbstractMethodError-t.

    Vagy en vagyok helikopter?

  3. Norbert Madarász március 21, 2014 9:32 de.

    Reflection határterületen, az állítás elejével kapcsolatban:

    Class cClass = Proxy.getProxyClass(IFoo.class.getClassLoader(), new Class[] {
      IFoo.class 
      });
    

    A cClass implementálja az IFoo interfészt, nem implementálja a metódusait, a kód mégis fordul.

    Futni is fut, ha kap egy hívás kezelőt:

    cClass.getConstructor(new Class[] { InvocationHandler.class })
                           .newInstance(new Object[] { handler });
    
    • Peter Verhas március 21, 2014 12:15 du.

      Ennyire nem kell messzire menni.

      • Norbert Madarász március 21, 2014 12:32 du.

        Témába vágó link: http://zeroturnaround.com/rebellabs/java-8-explained-default-methods/
        Érdekes cikket téma lehet még a “scala trait vs. java 8 defender method”.

        • Peter Verhas március 21, 2014 12:58 du.

          A hivatkozott cikket olvastam, de vigyázat! Ez még jóval a release verzió előtt jött ki.

          • shyrkahn március 24, 2014 12:54 de.

            Kicsit pongyola leszek, de ha jól sejtem, akkor gyakorlatilag annyiról van szó, hogy a Java interface-k a 8-as verziótól már rich interface-k lesznek (eddig thin interface-ek voltak), azaz lehet bennük konkrét metódus (viszont konkrét nem statikus final field nem). Ezek a default módosítóval ellátott metódusok gondolom hasonlóan működhetnek, mint a Scala nyelv trait metódusai. Itt is lényegében mixinről van szó implementálás helyett (http://en.wikipedia.org/wiki/Mixin), azaz ezek a default módosítóval ellátott metódusok (ha nem kerülnek felülírásra az implementáló osztályban) be lesznek illesztve a cél osztály byte kódjába. Legalább is a Scala fordító olyan byte kódot állít elő, amibe be lesz másolva az adott osztályba a trait konkrét metódusa. Gondolom itt is hasonló a helyzet. Imhol egy példa Scala nyelven:

            trait Greetings {
              def say() {
                 println("Say hello")
              }
            }
            
            class EnglishMan extends Greetings
            
            class FrenchMan extends Greetings {
              override def say() {
                println("Salute")
              }
            }
            
            (new EnglishMan()).say
            //Say hello
            
            (new FrenchMan()).say
            //Salute
            

            Egy igen fontos kérdés lehet ezek után az, hogy a multiple inheritance miként lesz kezelve, hiszen előfordulhat, hogy az öröklési hierarchiában két osztálynak is ugyanolyan szignatúrájú default metódusa lesz, két különböző megvalósítással. Ezt Scala-ban a nyelv alkotói a linearizationnel oldották meg. Ennek lényege, hogy jobbról, balra haladó a típusok feloldása és minden egyes kör végén a duplikálódott metódusok kiszűrésre kerülnek – megint csak a Scala fordító által. Ennek nyilván az a hátránya, hogy mindenkor tisztában kell lenni, hogy egy adott sorrendű extends és with rész milyen sorrendben fogja feloldani az azonos metódus szignatúrát tartalmazó traiteket. Imhol egy egyszerű példa:

            trait Action {
              def doSmth() { }
            }
            
            trait Cowboy extends Action {
              override def doSmth() = println("Bang")
            }
            
            trait Indian extends Action {
             override def doSmth() = println("Ipiapacs")
            }
            
            class IndianCowboy extends Indian with Cowboy
            class CowboyIndian extends Cowboy with Indian
            
            (new InidianCowboy()).doSmth
            //Bang
            
            (new CowboyIndian()).doSmth
            //Ipiapacs
            

            Java 8-ban nem tudom mi a megoldás, de mivel sokat ötleteltek a Scala nyelvből (is), ezért lehet hasonló megoldással találkozunk.

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: