SlideShare a Scribd company logo
Sven Efftinge - itemis AG


Vermisste Sprachfeatures in Java
Vorab




        Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand




                             Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?




                                       Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösungen (XML)?




                                       Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösungen (XML)?

•Wie machen das andere Sprachen




                                       Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösungen (XML)?

•Wie machen das andere Sprachen

•Rückwärtskompatibilität wird ignoriert



                                          Sven Efftinge - itemis AG
Properties
machen Code kürzer, prägnanter und damit besser wartbar
Kommt Ihnen das bekannt vor?




                               Sven Efftinge - itemis AG
Kommt Ihnen das bekannt vor?



            public class Customer {
              private String name;
              public String getName() {
                return name;
              }
              public void setName(String name) {
                this.name = name;
              }
            }




                                                   Sven Efftinge - itemis AG
Kommt Ihnen das bekannt vor?
public class Customer {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
                             Oder das?
}


                                         Customer c = new Customer();
                                         c.setName(“foobar”);
                                         //...
                                         return c.getName();




                                                    Sven Efftinge - itemis AG
Kommt Ihnen das bekannt vor?
public class Customer {
  private String name;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
                             Oder das?
}


                                         Customer c = new Customer();
                                         c.setName(“foobar”);
                                         //...
                                         return c.getName();




                                                    Sven Efftinge - itemis AG
Warum nicht einfach Felder benutzen?


 public class Customer {
   public String name;
 }


                           ... und ...
                                         Customer c = new Customer();
                                         c.name = “foobar”;
                                         //...
                                         return c.name;




                                                       Sven Efftinge - itemis AG
Warum nicht einfach Felder benutzen?
    public class Customer {
      public String name;
    }
                              ... und ...
                                            Customer c = new Customer();
                                            c.name = “foobar”;
                                            //...
                                            return c.name;




  Properties sind evtl. read-only
•
• getter bzw. setter enthalten Logik



                                                         Sven Efftinge - itemis AG
Mit “Properties”




• http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html

                                                          Sven Efftinge - itemis AG
Mit “Properties”
public class Customer {
  property String name;
                              ... und ...
}


                                                Customer c = new Customer();
                                                c.name = “foobar”;
                                                //...
                                                return c.name;




• http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html

                                                          Sven Efftinge - itemis AG
Mit “Properties”




Beispiel für read-only Property mit speziellem Setter
                      public class Customer {
                        property String name set {
                          if (val!=null)
                              this.name = val;
                        };
                      }


• http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html

                                                          Sven Efftinge - itemis AG
Type Inference
macht den Code leserlicher, wartbarer und reduziert Komplexität
Ein typisches Stück Javacode


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList<Person>();
  for(Person p : list) {
    if (!p.getName().equals(“Emil”))
       result.add(p);
  }
  return result;
}



                                           Sven Efftinge - itemis AG
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList<Person>();
  for(Person p : list) {
    if (!p.getName().equals(“Emil”))
       result.add(p);
  }
  return result;
}
             Typargument kann abgeleitet werden

                                           Sven Efftinge - itemis AG
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(Person p : list) {
    if (!p.getName().equals(“Emil”))
       result.add(p);
  }
  return result;
}
                 Variablentyp kann abgeleitet werden


                                           Sven Efftinge - itemis AG
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(p : list) {
    if (!p.getName().equals(“Emil”))
       result.add(p);
  }
  return result;
}
             Rückgabetyp kann abgeleitet werden

                                           Sven Efftinge - itemis AG
Type Inference


public withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(p : list) {
    if (!p.getName().equals(“Emil”))
       result.add(p);
  }
  return result;
}



                                           Sven Efftinge - itemis AG
Type Inference in Java 7?




                            Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration




                            Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();

// Ableiten aus dem Methodenkontext




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();

// Ableiten aus dem Methodenkontext
timeWaitsFor(new HashSet<>());




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();

// Ableiten aus dem Methodenkontext
timeWaitsFor(new HashSet<>());
// oder auch




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();

// Ableiten aus dem Methodenkontext
timeWaitsFor(new HashSet<>());
// oder auch
timeWaitsFor(Collections.emptySet());




                                         Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = new HashMap<String, List<Person>>();
var families = createFamilies();

// Ableiten aus dem Methodenkontext
timeWaitsFor(new HashSet<>());
// oder auch
timeWaitsFor(Collections.emptySet());
// Mit Java 5 :
// timeWaitsFor(Collections.<Man>emptySet());

                                           Sven Efftinge - itemis AG
Multiline Stringliterale
macht den Code leserlicher und wartbarer - ersetzt externe Lösungen
Neulich beim Testen....
public void testConfig() throws Exception {

 Configuration c = parse(
           quot;<config> quot; +

 
 
 
 quot; <bean class=quot;quot;+
                   Foobar.class.getName()+quot;quot;>quot;+
	 	 	 	 quot; <someProp value=quot;foobarquot;/>quot;+
	 	 	 	 quot; </bean>quot;+
	 	 	 	 quot;</config>quot;);

 assertEquals(quot;foobarquot;,
                c.getBeans().get(0).get(quot;somePropquot;));
}

                                            Sven Efftinge - itemis AG
Besser:
public void testConfig() throws Exception {

 Configuration c = parse(
	 	 quot;quot;quot;<config>
	 	 	 <bean class=quot;${Foobar.class.getName()}quot;>
	 	 	 	 <someProp value=quot;foobarquot;/>
	 	 	 </bean>
		      </config>quot;quot;quot;);
	 assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;));
}




                                               Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale




                                        Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten




                                        Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung




                                        Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)




                                        Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)

•Serienbriefe




                                        Sven Efftinge - itemis AG
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)

•Serienbriefe

•Nachrichten an den User (Logging, Error Messages)


                                        Sven Efftinge - itemis AG
Multiline Stringliterale “selbstgebaut”
public void testConfig() throws Exception {

 Configuration c = parse(
    S(/*<config>
	 	 	 <bean class=quot;${Foobar.class.getName()}quot;>
	 	 	 	 <someProp value=quot;foobarquot;/>
	 	 	 </bean>
		       </config>*/));
	 assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;));
}




                                                    author - company
Multiline Stringliterale “selbstgebaut”

public static String S() {
    StackTraceElement element = new RuntimeException().getStackTrace()[1];
    String name = element.getClassName().replace('.', '/') + quot;.javaquot;;
    InputStream in = getClassLoader().getResourceAsStream(name);
    String s = convertStreamToString(in, element.getLineNumber());
    return s.substring(s.indexOf(quot;/*quot;)+2, s.indexOf(quot;*/quot;));
}




                                                                  author - company
Initializer
macht strukturellen Code deklarativ und damit leserlicher
ersetzt externe Lösungen (z.B. XML)
Java ist objektorientiert, oder?




                                   Sven Efftinge - itemis AG
Java ist objektorientiert, oder?
Customer c = new Customer();
c.setName(quot;foobarquot;);
c.setId(4711);
		
Address address = new Address();
address.setStreet(quot;Schauenburgerstr. 116quot;);
address.setZip(quot;24118quot;);
address.setCity(quot;Kielquot;);
		
c.setAddress(address);
		
Order o1 = new Order();
o1.setArticleId(0815);
o1.setAmount(2);
c.addOrder(o1);


                                              Sven Efftinge - itemis AG
Aktuell bevorzugter Weg
<Customer
   name=quot;foobarquot;
   id=”4711”>
  <address>
     <Address
       street=”Schauenburgerstr. 116”
       zip=”24118”
       city=”Kiel”/>
  </address>
  <orders>
     <Order
       articleId=”0815”
       amount=”2”/>
  </orders>
</Customer>



                                        Sven Efftinge - itemis AG
So könnte es aussehen...

Customer c = new Customer {
   name = quot;foobarquot;;
   id        = 4711;
   address = new Address {
       street = quot;Schauenburgerstr. 116quot;;
       zip = quot;24118quot;;
       city = quot;Kielquot;;
   };
   addOrder(new Order {
       articleId = 0815;
       amount = 2;
   });
};
                                           Sven Efftinge - itemis AG
Initializer in anderen Sprachen
• Builder in Groovy


• Modelltransformationssprachen (ATL, QVT)


• In C# sieht’s so aus:   Person person = new Person {
                             FirstName = quot;Scottquot;,
                             LastName = quot;Guthriequot;,
                             Age = 32,
                             Address = new Address {
                               Street = quot;One Microsoft Wayquot;,
                               City = quot;Redmondquot;,
                               State = quot;WAquot;,
                               Zip = 98052
                             }
                          };


                                                               Sven Efftinge - itemis AG
Übrigens so geht es auch schon heute...
Customer c = new Customer() {{
    name = quot;foobarquot;;
    id       = 4711;
    address = new Address() {{
         street = quot;Schauenburgerstr. 116quot;;
         zip = quot;24118quot;;
         city = quot;Kielquot;;
    }};
    addOrder(new Order() {{
         articleId = 0815;
         amount = 2;
    }});
}};




                                             Sven Efftinge - itemis AG
Übrigens so geht es auch schon heute...
Customer c = new Customer() {{
    name = quot;foobarquot;;
    id       = 4711;
    address = new Address() {{
         street = quot;Schauenburgerstr. 116quot;;
         zip = quot;24118quot;;
         city = quot;Kielquot;;
    }};
    addOrder(new Order() {{
         articleId = 0815;
         amount = 2;
    }});
}};
       Kombination aus Anonymen Klassen und
          den “alten” non-static initializers

                                             Sven Efftinge - itemis AG
Literale für Collections
macht strukturellen Code deklarativ und damit leserlicher
Collections sind allgegenwärtig




                                  Sven Efftinge - itemis AG
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich.getName(), heinrich);
personByName.put(maria.getName(), maria);
personByName.put(horst.getName(), horst);




                                                   Sven Efftinge - itemis AG
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich.getName(), heinrich);
personByName.put(maria.getName(), maria);
personByName.put(horst.getName(), horst);




Map<String,Person> personByName = new HashMap<String,Person>() {
     heinrich.getName() 	 => heinrich,
     maria.getName() 	 => maria,
     horst.getName()

 => horst
     };




                                                   Sven Efftinge - itemis AG
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich.getName(), heinrich);
personByName.put(maria.getName(), maria);
personByName.put(horst.getName(), horst);



// mit Typinferenz könnte es so aussehen
var personByName = new HashMap<>() {
        heinrich.getName() 	 => heinrich,
        maria.getName() 	 => maria,
        horst.getName()

 => horst
        };




                                                   Sven Efftinge - itemis AG
Collectionliteral in C#
Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
   { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}},
   { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}},
   { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}}
};




                                                          Sven Efftinge - itemis AG
Collectionliteral in C#
Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
   { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}},
   { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}},
   { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}}
};

    In Kombination mit den zuvor genannten
  Erweiterungen könnte es in Java so aussehen:
var students = new HashMap<>() {
   111 => new StudentName {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, id=211},
   112 => new StudentName {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, id=317},
   113 => new StudentName {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, id=198}
};


                                                          Sven Efftinge - itemis AG
Collection-Literale in Java

 import static java.util.Arrays.asList;

 class Foo {
   List<String> createList() {
      return asList(“a”,”b”,”c”);
   }
 }




                                          Sven Efftinge - itemis AG
Collection-Literale in Java

import static com.google.common.collect.Maps.*;

class Foo {
  List<String, int> createMap() {
     return immutableMap(“a”,2,”c”,3);
  }
}




                                   Sven Efftinge - itemis AG
Collection-Literale in Java




          Eine Proposal für eine Spracherweiterung
                      gibt es z.B. unter
 http://jroller.com/scolebourne/entry/java_7_list_and_map




                                           Sven Efftinge - itemis AG
Anonymous Types
Strukturierte Sichten auf Datenbestände
Anonyme Datenstrukturen erzeugen

var students = new Map<>()
  {
    111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211},
    112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317},
    113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989}
  };




                                                         Sven Efftinge - itemis AG
Anonyme Datenstrukturen erzeugen

var students = new Map<>()
  {
    111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211},
    112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317},
    113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989}
  };


Map<Int, AnonymousType<firstName::String,lastName::String,ID::Int>>



          Typinferenz ist unbedingt erforderlich

                                                         Sven Efftinge - itemis AG
Closures
Neue Kontrollstrukturen per Library
Typischer Javacode




                     Sven Efftinge - itemis AG
Typischer Javacode

List<Person> filterByName(List<Person> persons, String name) {

 List<Person> result = new ArrayList<Person>();
	 for(Person person : persons) {
    	 if (person.getName().equals(name)) {
	 	 	 result.add(person);
		}
    }
	 return result;
}




                                                Sven Efftinge - itemis AG
Das Selbe mit Closures




List<Person> filterByName(List<Person> persons, String name) {

 return persons.select({p => p.getName().equals(name)});
}




                                                Sven Efftinge - itemis AG
Das Selbe mit Closures
List<Person> filterByName(List<Person> persons, String name) {

 return persons.select({p => p.getName().equals(name)});
}

List<T> select({T=>boolean} function) {

 List<T> result = new ArrayList<T>();
	 for(T e : this) {
    	 if (function.invoke(e)) {
	 	 	 result.add(e);
		}
    }
	 return result;
}


                                                Sven Efftinge - itemis AG
Closure: Anonyme Funktion




                            Sven Efftinge - itemis AG
Closure: Anonyme Funktion
• Ein Literal für Funktionen




                               Sven Efftinge - itemis AG
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu




                                                        Sven Efftinge - itemis AG
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu



{Person p=>p.getName().equals(“foo”)}




                                                        Sven Efftinge - itemis AG
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu



{Person p=>p.getName().equals(“foo”)}


   Declared
  Parameters


                                                        Sven Efftinge - itemis AG
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu



{Person p=>p.getName().equals(“foo”)}


   Declared                    Block or expression
  Parameters                     to be executed


                                                        Sven Efftinge - itemis AG
Typische Higher-Order Functions auf Mengen




                                   Sven Efftinge - itemis AG
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion
  ‘true’ zurückgegeben hat.




                                                     Sven Efftinge - itemis AG
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion
  ‘true’ zurückgegeben hat.

• List<R> collect({T => R} func)
  Sammelt die Rückgabewerte und gibt sie als Liste zurück




                                                     Sven Efftinge - itemis AG
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion
  ‘true’ zurückgegeben hat.

• List<R> collect({T => R} func)
  Sammelt die Rückgabewerte und gibt sie als Liste zurück

• List<T> sort({T,T => int} func)
  Sortiert die Liste anhand einer Vergleichsfunktion (Comparator)




                                                     Sven Efftinge - itemis AG
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion
  ‘true’ zurückgegeben hat.

• List<R> collect({T => R} func)
  Sammelt die Rückgabewerte und gibt sie als Liste zurück

• List<T> sort({T,T => int} func)
  Sortiert die Liste anhand einer Vergleichsfunktion (Comparator)

• boolean exists({T => boolean} func)
  Prüft, ob die Funktion für mindestens ein Element ‘true’ zurück gibt


                                                     Sven Efftinge - itemis AG
Resourcehandling




                   Sven Efftinge - itemis AG
Resourcehandling

 FileInputStream input = new FileInputStream(fileName);
 try {
 
 // use input
 } finally {
    try {
 
 
 input.close();
    } catch (IOException ex) {
       logger.log(Level.SEVERE, ex.getMessage(), ex);
 
}
 }



                                                Sven Efftinge - itemis AG
Resourcehandling mit Closures




with(new FileInputStream(fileName), { in =>

 // use input
});




                                             Sven Efftinge - itemis AG
Resourcehandling mit Closures
with(new FileInputStream(fileName), { in =>

 // use input
});
void with(FileInputStream in, {=> FileInputStream} block) {

 try {

 
 block.invoke(in);

 } finally {
    

 try {

 
 
 input.close();
    

 } catch (IOException ex) {
      
 
 logger.log(Level.SEVERE, ex.getMessage(), ex);


}

}
}

                                                    Sven Efftinge - itemis AG
Dynamic Dispatch / Multimethods
Visitors, switches, etc. adé
Polymorphismus in Java

class Foo {
  void doStuff() {
     System.out.println(“foo”);             Foo
  }
}
class SpecialFoo extends Foo {
  void doStuff() {
     System.out.println(“specialfoo”);
                                         SpecialFoo
  }
}




                                          Sven Efftinge - itemis AG
Polymorphismus in Java

new SpecialFoo().doStuff();
((Foo) new SpecialFoo()).doStuff();
                                            Foo

class Foo {
  void doStuff() {
     System.out.println(“foo”);
  }                                      SpecialFoo
}
class SpecialFoo extends Foo {
  void doStuff() {
     System.out.println(“specialfoo”);
  }
}

                                          Sven Efftinge - itemis AG
Polymorphismus in Java

new SpecialFoo().doStuff();
((Foo) new SpecialFoo()).doStuff();
                                         Foo
output:
specialfoo
specialfoo


                                      SpecialFoo




                                       Sven Efftinge - itemis AG
Polymorphismus in Java (2)

class Foo {
}
class SpecialFoo extends Foo {
}
static void doStuff(SpecialFoo arg) {
  System.out.println(“specialfoo”);
}
static void doStuff(Foo arg) {
  System.out.println(“foo”);
}




                                        Sven Efftinge - itemis AG
Polymorphismus in Java (2)

doStuff(new SpecialFoo());
doStuff((Foo) new SpecialFoo());


class Foo {
}
class SpecialFoo extends Foo {
}
static void doStuff(SpecialFoo arg) {
  System.out.println(“specialfoo”);
}
static void doStuff(Foo arg) {
  System.out.println(“foo”);
}


                                        Sven Efftinge - itemis AG
Polymorphismus in Java (2)

doStuff(new SpecialFoo());
doStuff((Foo) new SpecialFoo());

output:
specialfoo
foo




                                   Sven Efftinge - itemis AG
Mit Dynamic Dispatch in Java

doStuff(new SpecialFoo());
doStuff((Foo) new SpecialFoo();

output:
specialfoo
specialfoo




                                  Sven Efftinge - itemis AG
Dynamic Dispatch in Java (2)

class Foo {
  //....
   public boolean equals(Object arg) {
        if (arg instanceof Foo) {
           Foo arg1 = (Foo) arg;
           return name.equals(arg.name);
        }
        return false;
   }
}




                                           Sven Efftinge - itemis AG
Dynamic Dispatch in Java (2)

class Foo {
  //...
   public boolean equals(Foo arg) {
        return name.equals(arg.name);
   }
}




                                        Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch




                                 Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien




                                             Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Pattern




                                             Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Pattern

• Ersetzt viele ‘instanceof’ Abfragen




                                             Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Pattern

• Ersetzt viele ‘instanceof’ Abfragen

• Auch sehr nett in Kombination mit “Extension Methods”

       foo.staticMethod() statt staticMethod(foo)




                                                    Sven Efftinge - itemis AG
Metaprogramming
Dynamischen Code in statische getypter Sprache?
Dynamische Programmierung




                            Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API




                            Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlich!




                                    Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlich!

• Dynamisch Klassen und Methoden ändern




                                          Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlich!

• Dynamisch Klassen und Methoden ändern

• Scripting

                                          Sven Efftinge - itemis AG
Dynamisch Methoden Aufrufen



                   public Object getName(Object myObj) {
               	     	     Class<?> myClass = myObj.getClass();
                           try {
               	     	

   In Java :   	     	     	     Method method = myClass.getMethod(quot;getNamequot;);
                                 return method.invoke(myObj);
               	     	     	
                           } catch (Exception e) {
               	     	
               	     	     	     // handle exception
               	     	     }
                           return null;
               	     	
               	     }




                                                         Sven Efftinge - itemis AG
Dynamisch Methoden Aufrufen




                    public getName(Object myObj) {
  In Groovy :               return myObj.getName();
                	     	
                    }




                                                      Sven Efftinge - itemis AG
Statische Typisierung




                        Sven Efftinge - itemis AG
Statische Typisierung

•Grundsätzlich sehr nützlich (Feedback!)




                                           Sven Efftinge - itemis AG
Statische Typisierung

•Grundsätzlich sehr nützlich (Feedback!)

•Die Werkzeugunterstützung basiert darauf




                                           Sven Efftinge - itemis AG
Statische Typisierung

•Grundsätzlich sehr nützlich (Feedback!)

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspruch zu




                                           Sven Efftinge - itemis AG
Statische Typisierung

•Grundsätzlich sehr nützlich (Feedback!)

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspruch zu

 •Kurzen Turn-Arounds




                                           Sven Efftinge - itemis AG
Statische Typisierung

•Grundsätzlich sehr nützlich (Feedback!)

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspruch zu

 •Kurzen Turn-Arounds

 •Interaktiver Entwicklung



                                           Sven Efftinge - itemis AG
Statische Typisierung




                        Sven Efftinge - itemis AG
Statische Typisierung

•Kein Ersatz für Unittests




                             Sven Efftinge - itemis AG
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität




                             Sven Efftinge - itemis AG
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen




                                   Sven Efftinge - itemis AG
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen

 •Generics




                                   Sven Efftinge - itemis AG
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen

 •Generics

•oft umständliche, generische Programmierung via
 Reflection


                                        Sven Efftinge - itemis AG
Warum nicht beides?




                      Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden




                                                        Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung eher in der Framework-Entwicklung




                                                        Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung eher in der Framework-Entwicklung


• z.B. durch explizite CompilerEscapes : foo.~unkownMethod()




                                                        Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung eher in der Framework-Entwicklung


• z.B. durch explizite CompilerEscapes : foo.~unkownMethod()


• Casts nicht im ByteCode




                                                        Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung eher in der Framework-Entwicklung


• z.B. durch explizite CompilerEscapes : foo.~unkownMethod()


• Casts nicht im ByteCode


• methodMissing() Methode auf java.lang.Object




                                                        Sven Efftinge - itemis AG
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung eher in der Framework-Entwicklung


• z.B. durch explizite CompilerEscapes : foo.~unkownMethod()


• Casts nicht im ByteCode


• methodMissing() Methode auf java.lang.Object


• Zur Laufzeit Methoden und Klassen hinzufügen



                                                        Sven Efftinge - itemis AG
Verschiedenes
Was nervt ...




                Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays

•Built-in Operatoren



                       Sven Efftinge - itemis AG
Java ist super!




                  Sven Efftinge - itemis AG
Java ist super!

•Open-Source Community




                         Sven Efftinge - itemis AG
Java ist super!

•Open-Source Community

•Die Virtual Machine




                         Sven Efftinge - itemis AG
Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)




                                        Sven Efftinge - itemis AG
Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit




                                        Sven Efftinge - itemis AG
Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit

•Statische Typisierung



                                        Sven Efftinge - itemis AG
Vielen Dank für Ihre Aufmerksamkeit

Noch Fragen?

More Related Content

What's hot

Tech Talk: Pyparsing
Tech Talk: PyparsingTech Talk: Pyparsing
Tech Talk: Pyparsingschlauch
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
thoherr
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
gedoplan
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Brigitte Jellinek
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
Jonathan Weiss
 

What's hot (6)

Tech Talk: Pyparsing
Tech Talk: PyparsingTech Talk: Pyparsing
Tech Talk: Pyparsing
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
Perl - die Taschenkettensäge unter den Programmiersprachen - Vortrag 2003
 
Tutorium 4
Tutorium 4Tutorium 4
Tutorium 4
 
An Introduction to Ruby
An Introduction to RubyAn Introduction to Ruby
An Introduction to Ruby
 

Viewers also liked

Increible
IncreibleIncreible
Increible
Mireia Buchaca
 
CineGrid @ VPT Alles Over Projectie
CineGrid @ VPT Alles Over ProjectieCineGrid @ VPT Alles Over Projectie
CineGrid @ VPT Alles Over Projectie
Frank Kresin
 
Blogging in Venezuelan municipal schools
Blogging in Venezuelan municipal schoolsBlogging in Venezuelan municipal schools
Blogging in Venezuelan municipal schools
ICT consultant for CIT
 
Tapping Lost Potential paper for Gary Gottlieb
Tapping Lost Potential paper for Gary GottliebTapping Lost Potential paper for Gary Gottlieb
Tapping Lost Potential paper for Gary Gottlieb
Jay Kemp Smith
 
Innocent: New marketing platform ideas for 2009
Innocent:  New marketing platform ideas for 2009Innocent:  New marketing platform ideas for 2009
Innocent: New marketing platform ideas for 2009
Fjord
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
Sven Efftinge
 

Viewers also liked (6)

Increible
IncreibleIncreible
Increible
 
CineGrid @ VPT Alles Over Projectie
CineGrid @ VPT Alles Over ProjectieCineGrid @ VPT Alles Over Projectie
CineGrid @ VPT Alles Over Projectie
 
Blogging in Venezuelan municipal schools
Blogging in Venezuelan municipal schoolsBlogging in Venezuelan municipal schools
Blogging in Venezuelan municipal schools
 
Tapping Lost Potential paper for Gary Gottlieb
Tapping Lost Potential paper for Gary GottliebTapping Lost Potential paper for Gary Gottlieb
Tapping Lost Potential paper for Gary Gottlieb
 
Innocent: New marketing platform ideas for 2009
Innocent:  New marketing platform ideas for 2009Innocent:  New marketing platform ideas for 2009
Innocent: New marketing platform ideas for 2009
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
 

More from Sven Efftinge

Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With Xtext
Sven Efftinge
 
Future of Xtext
Future of XtextFuture of Xtext
Future of Xtext
Sven Efftinge
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
Sven Efftinge
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
Sven Efftinge
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
Sven Efftinge
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
Sven Efftinge
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)
Sven Efftinge
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
Sven Efftinge
 
Eclipse Xtend
Eclipse XtendEclipse Xtend
Eclipse Xtend
Sven Efftinge
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
Sven Efftinge
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
Sven Efftinge
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010
Sven Efftinge
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developers
Sven Efftinge
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
Sven Efftinge
 
Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl Design
Sven Efftinge
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile Projects
Sven Efftinge
 
Xtext Eclipse Con
Xtext Eclipse ConXtext Eclipse Con
Xtext Eclipse Con
Sven Efftinge
 
Generic Editor
Generic EditorGeneric Editor
Generic Editor
Sven Efftinge
 
Eclipse Banking Day
Eclipse Banking DayEclipse Banking Day
Eclipse Banking Day
Sven Efftinge
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)
Sven Efftinge
 

More from Sven Efftinge (20)

Language Engineering With Xtext
Language Engineering With XtextLanguage Engineering With Xtext
Language Engineering With Xtext
 
Future of Xtext
Future of XtextFuture of Xtext
Future of Xtext
 
Auto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with XtendAuto-GWT : Better GWT Programming with Xtend
Auto-GWT : Better GWT Programming with Xtend
 
Functional programming with Xtend
Functional programming with XtendFunctional programming with Xtend
Functional programming with Xtend
 
Codegeneration With Xtend
Codegeneration With XtendCodegeneration With Xtend
Codegeneration With Xtend
 
Gwt and Xtend
Gwt and XtendGwt and Xtend
Gwt and Xtend
 
Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)Domain Specific Languages (EclipseCon 2012)
Domain Specific Languages (EclipseCon 2012)
 
Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012Xtend @ EclipseCon 2012
Xtend @ EclipseCon 2012
 
Eclipse Xtend
Eclipse XtendEclipse Xtend
Eclipse Xtend
 
This Is Not Your Father's Java
This Is Not Your Father's JavaThis Is Not Your Father's Java
This Is Not Your Father's Java
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
 
Xtext at MDD Day 2010
Xtext at MDD Day 2010Xtext at MDD Day 2010
Xtext at MDD Day 2010
 
Dependency Injection for Eclipse developers
Dependency Injection for Eclipse developersDependency Injection for Eclipse developers
Dependency Injection for Eclipse developers
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Challenges In Dsl Design
Challenges In Dsl DesignChallenges In Dsl Design
Challenges In Dsl Design
 
Code Generation in Agile Projects
Code Generation in Agile ProjectsCode Generation in Agile Projects
Code Generation in Agile Projects
 
Xtext Eclipse Con
Xtext Eclipse ConXtext Eclipse Con
Xtext Eclipse Con
 
Generic Editor
Generic EditorGeneric Editor
Generic Editor
 
Eclipse Banking Day
Eclipse Banking DayEclipse Banking Day
Eclipse Banking Day
 
Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)Bessere Softwareentwicklung (Itemis Wintercon)
Bessere Softwareentwicklung (Itemis Wintercon)
 

Vermisste Sprachfeatures in Java (german)

  • 1. Sven Efftinge - itemis AG Vermisste Sprachfeatures in Java
  • 2. Vorab Sven Efftinge - itemis AG
  • 3. Vorab •Blick über den Tellerrand Sven Efftinge - itemis AG
  • 4. Vorab •Blick über den Tellerrand •Welche Probleme lösen wir auf welche Weise? Sven Efftinge - itemis AG
  • 5. Vorab •Blick über den Tellerrand •Welche Probleme lösen wir auf welche Weise? •Wann und warum nutzen wir andere Lösungen (XML)? Sven Efftinge - itemis AG
  • 6. Vorab •Blick über den Tellerrand •Welche Probleme lösen wir auf welche Weise? •Wann und warum nutzen wir andere Lösungen (XML)? •Wie machen das andere Sprachen Sven Efftinge - itemis AG
  • 7. Vorab •Blick über den Tellerrand •Welche Probleme lösen wir auf welche Weise? •Wann und warum nutzen wir andere Lösungen (XML)? •Wie machen das andere Sprachen •Rückwärtskompatibilität wird ignoriert Sven Efftinge - itemis AG
  • 8. Properties machen Code kürzer, prägnanter und damit besser wartbar
  • 9. Kommt Ihnen das bekannt vor? Sven Efftinge - itemis AG
  • 10. Kommt Ihnen das bekannt vor? public class Customer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } Sven Efftinge - itemis AG
  • 11. Kommt Ihnen das bekannt vor? public class Customer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } Oder das? } Customer c = new Customer(); c.setName(“foobar”); //... return c.getName(); Sven Efftinge - itemis AG
  • 12. Kommt Ihnen das bekannt vor? public class Customer { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } Oder das? } Customer c = new Customer(); c.setName(“foobar”); //... return c.getName(); Sven Efftinge - itemis AG
  • 13. Warum nicht einfach Felder benutzen? public class Customer { public String name; } ... und ... Customer c = new Customer(); c.name = “foobar”; //... return c.name; Sven Efftinge - itemis AG
  • 14. Warum nicht einfach Felder benutzen? public class Customer { public String name; } ... und ... Customer c = new Customer(); c.name = “foobar”; //... return c.name; Properties sind evtl. read-only • • getter bzw. setter enthalten Logik Sven Efftinge - itemis AG
  • 16. Mit “Properties” public class Customer { property String name; ... und ... } Customer c = new Customer(); c.name = “foobar”; //... return c.name; • http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html Sven Efftinge - itemis AG
  • 17. Mit “Properties” Beispiel für read-only Property mit speziellem Setter public class Customer { property String name set { if (val!=null) this.name = val; }; } • http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html Sven Efftinge - itemis AG
  • 18. Type Inference macht den Code leserlicher, wartbarer und reduziert Komplexität
  • 19. Ein typisches Stück Javacode public List<Person> withoutEmil(List<Person> list) { List<Person> result = new ArrayList<Person>(); for(Person p : list) { if (!p.getName().equals(“Emil”)) result.add(p); } return result; } Sven Efftinge - itemis AG
  • 20. Type Inference public List<Person> withoutEmil(List<Person> list) { List<Person> result = new ArrayList<Person>(); for(Person p : list) { if (!p.getName().equals(“Emil”)) result.add(p); } return result; } Typargument kann abgeleitet werden Sven Efftinge - itemis AG
  • 21. Type Inference public List<Person> withoutEmil(List<Person> list) { List<Person> result = new ArrayList(); for(Person p : list) { if (!p.getName().equals(“Emil”)) result.add(p); } return result; } Variablentyp kann abgeleitet werden Sven Efftinge - itemis AG
  • 22. Type Inference public List<Person> withoutEmil(List<Person> list) { List<Person> result = new ArrayList(); for(p : list) { if (!p.getName().equals(“Emil”)) result.add(p); } return result; } Rückgabetyp kann abgeleitet werden Sven Efftinge - itemis AG
  • 23. Type Inference public withoutEmil(List<Person> list) { List<Person> result = new ArrayList(); for(p : list) { if (!p.getName().equals(“Emil”)) result.add(p); } return result; } Sven Efftinge - itemis AG
  • 24. Type Inference in Java 7? Sven Efftinge - itemis AG
  • 25. Type Inference in Java 7? // Variablen Deklaration Sven Efftinge - itemis AG
  • 26. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); Sven Efftinge - itemis AG
  • 27. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); Sven Efftinge - itemis AG
  • 28. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); Sven Efftinge - itemis AG
  • 29. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); // Ableiten aus dem Methodenkontext Sven Efftinge - itemis AG
  • 30. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); // Ableiten aus dem Methodenkontext timeWaitsFor(new HashSet<>()); Sven Efftinge - itemis AG
  • 31. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); // Ableiten aus dem Methodenkontext timeWaitsFor(new HashSet<>()); // oder auch Sven Efftinge - itemis AG
  • 32. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); // Ableiten aus dem Methodenkontext timeWaitsFor(new HashSet<>()); // oder auch timeWaitsFor(Collections.emptySet()); Sven Efftinge - itemis AG
  • 33. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); var families = new HashMap<String, List<Person>>(); var families = createFamilies(); // Ableiten aus dem Methodenkontext timeWaitsFor(new HashSet<>()); // oder auch timeWaitsFor(Collections.emptySet()); // Mit Java 5 : // timeWaitsFor(Collections.<Man>emptySet()); Sven Efftinge - itemis AG
  • 34. Multiline Stringliterale macht den Code leserlicher und wartbarer - ersetzt externe Lösungen
  • 35. Neulich beim Testen.... public void testConfig() throws Exception { Configuration c = parse( quot;<config> quot; + quot; <bean class=quot;quot;+ Foobar.class.getName()+quot;quot;>quot;+ quot; <someProp value=quot;foobarquot;/>quot;+ quot; </bean>quot;+ quot;</config>quot;); assertEquals(quot;foobarquot;, c.getBeans().get(0).get(quot;somePropquot;)); } Sven Efftinge - itemis AG
  • 36. Besser: public void testConfig() throws Exception { Configuration c = parse( quot;quot;quot;<config> <bean class=quot;${Foobar.class.getName()}quot;> <someProp value=quot;foobarquot;/> </bean> </config>quot;quot;quot;); assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;)); } Sven Efftinge - itemis AG
  • 37. Anwendungsfälle für Multiline Stringliterale Sven Efftinge - itemis AG
  • 38. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten Sven Efftinge - itemis AG
  • 39. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung Sven Efftinge - itemis AG
  • 40. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung •HTML/XML Erzeugung (Servlets, etc.) Sven Efftinge - itemis AG
  • 41. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung •HTML/XML Erzeugung (Servlets, etc.) •Serienbriefe Sven Efftinge - itemis AG
  • 42. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung •HTML/XML Erzeugung (Servlets, etc.) •Serienbriefe •Nachrichten an den User (Logging, Error Messages) Sven Efftinge - itemis AG
  • 43. Multiline Stringliterale “selbstgebaut” public void testConfig() throws Exception { Configuration c = parse( S(/*<config> <bean class=quot;${Foobar.class.getName()}quot;> <someProp value=quot;foobarquot;/> </bean> </config>*/)); assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;)); } author - company
  • 44. Multiline Stringliterale “selbstgebaut” public static String S() { StackTraceElement element = new RuntimeException().getStackTrace()[1]; String name = element.getClassName().replace('.', '/') + quot;.javaquot;; InputStream in = getClassLoader().getResourceAsStream(name); String s = convertStreamToString(in, element.getLineNumber()); return s.substring(s.indexOf(quot;/*quot;)+2, s.indexOf(quot;*/quot;)); } author - company
  • 45. Initializer macht strukturellen Code deklarativ und damit leserlicher ersetzt externe Lösungen (z.B. XML)
  • 46. Java ist objektorientiert, oder? Sven Efftinge - itemis AG
  • 47. Java ist objektorientiert, oder? Customer c = new Customer(); c.setName(quot;foobarquot;); c.setId(4711); Address address = new Address(); address.setStreet(quot;Schauenburgerstr. 116quot;); address.setZip(quot;24118quot;); address.setCity(quot;Kielquot;); c.setAddress(address); Order o1 = new Order(); o1.setArticleId(0815); o1.setAmount(2); c.addOrder(o1); Sven Efftinge - itemis AG
  • 48. Aktuell bevorzugter Weg <Customer name=quot;foobarquot; id=”4711”> <address> <Address street=”Schauenburgerstr. 116” zip=”24118” city=”Kiel”/> </address> <orders> <Order articleId=”0815” amount=”2”/> </orders> </Customer> Sven Efftinge - itemis AG
  • 49. So könnte es aussehen... Customer c = new Customer { name = quot;foobarquot;; id = 4711; address = new Address { street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }; addOrder(new Order { articleId = 0815; amount = 2; }); }; Sven Efftinge - itemis AG
  • 50. Initializer in anderen Sprachen • Builder in Groovy • Modelltransformationssprachen (ATL, QVT) • In C# sieht’s so aus: Person person = new Person { FirstName = quot;Scottquot;, LastName = quot;Guthriequot;, Age = 32, Address = new Address { Street = quot;One Microsoft Wayquot;, City = quot;Redmondquot;, State = quot;WAquot;, Zip = 98052 } }; Sven Efftinge - itemis AG
  • 51. Übrigens so geht es auch schon heute... Customer c = new Customer() {{ name = quot;foobarquot;; id = 4711; address = new Address() {{ street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }}; addOrder(new Order() {{ articleId = 0815; amount = 2; }}); }}; Sven Efftinge - itemis AG
  • 52. Übrigens so geht es auch schon heute... Customer c = new Customer() {{ name = quot;foobarquot;; id = 4711; address = new Address() {{ street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }}; addOrder(new Order() {{ articleId = 0815; amount = 2; }}); }}; Kombination aus Anonymen Klassen und den “alten” non-static initializers Sven Efftinge - itemis AG
  • 53. Literale für Collections macht strukturellen Code deklarativ und damit leserlicher
  • 54. Collections sind allgegenwärtig Sven Efftinge - itemis AG
  • 55. Collections sind allgegenwärtig Map<String,Person> personByName = new HashMap<String,Person>(); personByName.put(heinrich.getName(), heinrich); personByName.put(maria.getName(), maria); personByName.put(horst.getName(), horst); Sven Efftinge - itemis AG
  • 56. Collections sind allgegenwärtig Map<String,Person> personByName = new HashMap<String,Person>(); personByName.put(heinrich.getName(), heinrich); personByName.put(maria.getName(), maria); personByName.put(horst.getName(), horst); Map<String,Person> personByName = new HashMap<String,Person>() { heinrich.getName() => heinrich, maria.getName() => maria, horst.getName() => horst }; Sven Efftinge - itemis AG
  • 57. Collections sind allgegenwärtig Map<String,Person> personByName = new HashMap<String,Person>(); personByName.put(heinrich.getName(), heinrich); personByName.put(maria.getName(), maria); personByName.put(horst.getName(), horst); // mit Typinferenz könnte es so aussehen var personByName = new HashMap<>() { heinrich.getName() => heinrich, maria.getName() => maria, horst.getName() => horst }; Sven Efftinge - itemis AG
  • 58. Collectionliteral in C# Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}}, { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}}, { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}} }; Sven Efftinge - itemis AG
  • 59. Collectionliteral in C# Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}}, { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}}, { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}} }; In Kombination mit den zuvor genannten Erweiterungen könnte es in Java so aussehen: var students = new HashMap<>() { 111 => new StudentName {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, id=211}, 112 => new StudentName {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, id=317}, 113 => new StudentName {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, id=198} }; Sven Efftinge - itemis AG
  • 60. Collection-Literale in Java import static java.util.Arrays.asList; class Foo { List<String> createList() { return asList(“a”,”b”,”c”); } } Sven Efftinge - itemis AG
  • 61. Collection-Literale in Java import static com.google.common.collect.Maps.*; class Foo { List<String, int> createMap() { return immutableMap(“a”,2,”c”,3); } } Sven Efftinge - itemis AG
  • 62. Collection-Literale in Java Eine Proposal für eine Spracherweiterung gibt es z.B. unter http://jroller.com/scolebourne/entry/java_7_list_and_map Sven Efftinge - itemis AG
  • 64. Anonyme Datenstrukturen erzeugen var students = new Map<>() { 111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211}, 112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317}, 113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989} }; Sven Efftinge - itemis AG
  • 65. Anonyme Datenstrukturen erzeugen var students = new Map<>() { 111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211}, 112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317}, 113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989} }; Map<Int, AnonymousType<firstName::String,lastName::String,ID::Int>> Typinferenz ist unbedingt erforderlich Sven Efftinge - itemis AG
  • 67. Typischer Javacode Sven Efftinge - itemis AG
  • 68. Typischer Javacode List<Person> filterByName(List<Person> persons, String name) { List<Person> result = new ArrayList<Person>(); for(Person person : persons) { if (person.getName().equals(name)) { result.add(person); } } return result; } Sven Efftinge - itemis AG
  • 69. Das Selbe mit Closures List<Person> filterByName(List<Person> persons, String name) { return persons.select({p => p.getName().equals(name)}); } Sven Efftinge - itemis AG
  • 70. Das Selbe mit Closures List<Person> filterByName(List<Person> persons, String name) { return persons.select({p => p.getName().equals(name)}); } List<T> select({T=>boolean} function) { List<T> result = new ArrayList<T>(); for(T e : this) { if (function.invoke(e)) { result.add(e); } } return result; } Sven Efftinge - itemis AG
  • 71. Closure: Anonyme Funktion Sven Efftinge - itemis AG
  • 72. Closure: Anonyme Funktion • Ein Literal für Funktionen Sven Efftinge - itemis AG
  • 73. Closure: Anonyme Funktion • Ein Literal für Funktionen • Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu Sven Efftinge - itemis AG
  • 74. Closure: Anonyme Funktion • Ein Literal für Funktionen • Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu {Person p=>p.getName().equals(“foo”)} Sven Efftinge - itemis AG
  • 75. Closure: Anonyme Funktion • Ein Literal für Funktionen • Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu {Person p=>p.getName().equals(“foo”)} Declared Parameters Sven Efftinge - itemis AG
  • 76. Closure: Anonyme Funktion • Ein Literal für Funktionen • Speichert den Umgebenden Kontext und greift bei der Ausführung darauf zu {Person p=>p.getName().equals(“foo”)} Declared Block or expression Parameters to be executed Sven Efftinge - itemis AG
  • 77. Typische Higher-Order Functions auf Mengen Sven Efftinge - itemis AG
  • 78. Typische Higher-Order Functions auf Mengen • List<T> select({T => boolean} func) Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion ‘true’ zurückgegeben hat. Sven Efftinge - itemis AG
  • 79. Typische Higher-Order Functions auf Mengen • List<T> select({T => boolean} func) Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion ‘true’ zurückgegeben hat. • List<R> collect({T => R} func) Sammelt die Rückgabewerte und gibt sie als Liste zurück Sven Efftinge - itemis AG
  • 80. Typische Higher-Order Functions auf Mengen • List<T> select({T => boolean} func) Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion ‘true’ zurückgegeben hat. • List<R> collect({T => R} func) Sammelt die Rückgabewerte und gibt sie als Liste zurück • List<T> sort({T,T => int} func) Sortiert die Liste anhand einer Vergleichsfunktion (Comparator) Sven Efftinge - itemis AG
  • 81. Typische Higher-Order Functions auf Mengen • List<T> select({T => boolean} func) Gibt eine neue Liste, die nur die Werte enthält, für die die Funktion ‘true’ zurückgegeben hat. • List<R> collect({T => R} func) Sammelt die Rückgabewerte und gibt sie als Liste zurück • List<T> sort({T,T => int} func) Sortiert die Liste anhand einer Vergleichsfunktion (Comparator) • boolean exists({T => boolean} func) Prüft, ob die Funktion für mindestens ein Element ‘true’ zurück gibt Sven Efftinge - itemis AG
  • 82. Resourcehandling Sven Efftinge - itemis AG
  • 83. Resourcehandling FileInputStream input = new FileInputStream(fileName); try { // use input } finally { try { input.close(); } catch (IOException ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } } Sven Efftinge - itemis AG
  • 84. Resourcehandling mit Closures with(new FileInputStream(fileName), { in => // use input }); Sven Efftinge - itemis AG
  • 85. Resourcehandling mit Closures with(new FileInputStream(fileName), { in => // use input }); void with(FileInputStream in, {=> FileInputStream} block) { try { block.invoke(in); } finally { try { input.close(); } catch (IOException ex) { logger.log(Level.SEVERE, ex.getMessage(), ex); } } } Sven Efftinge - itemis AG
  • 86. Dynamic Dispatch / Multimethods Visitors, switches, etc. adé
  • 87. Polymorphismus in Java class Foo { void doStuff() { System.out.println(“foo”); Foo } } class SpecialFoo extends Foo { void doStuff() { System.out.println(“specialfoo”); SpecialFoo } } Sven Efftinge - itemis AG
  • 88. Polymorphismus in Java new SpecialFoo().doStuff(); ((Foo) new SpecialFoo()).doStuff(); Foo class Foo { void doStuff() { System.out.println(“foo”); } SpecialFoo } class SpecialFoo extends Foo { void doStuff() { System.out.println(“specialfoo”); } } Sven Efftinge - itemis AG
  • 89. Polymorphismus in Java new SpecialFoo().doStuff(); ((Foo) new SpecialFoo()).doStuff(); Foo output: specialfoo specialfoo SpecialFoo Sven Efftinge - itemis AG
  • 90. Polymorphismus in Java (2) class Foo { } class SpecialFoo extends Foo { } static void doStuff(SpecialFoo arg) { System.out.println(“specialfoo”); } static void doStuff(Foo arg) { System.out.println(“foo”); } Sven Efftinge - itemis AG
  • 91. Polymorphismus in Java (2) doStuff(new SpecialFoo()); doStuff((Foo) new SpecialFoo()); class Foo { } class SpecialFoo extends Foo { } static void doStuff(SpecialFoo arg) { System.out.println(“specialfoo”); } static void doStuff(Foo arg) { System.out.println(“foo”); } Sven Efftinge - itemis AG
  • 92. Polymorphismus in Java (2) doStuff(new SpecialFoo()); doStuff((Foo) new SpecialFoo()); output: specialfoo foo Sven Efftinge - itemis AG
  • 93. Mit Dynamic Dispatch in Java doStuff(new SpecialFoo()); doStuff((Foo) new SpecialFoo(); output: specialfoo specialfoo Sven Efftinge - itemis AG
  • 94. Dynamic Dispatch in Java (2) class Foo { //.... public boolean equals(Object arg) { if (arg instanceof Foo) { Foo arg1 = (Foo) arg; return name.equals(arg.name); } return false; } } Sven Efftinge - itemis AG
  • 95. Dynamic Dispatch in Java (2) class Foo { //... public boolean equals(Foo arg) { return name.equals(arg.name); } } Sven Efftinge - itemis AG
  • 96. Multimethod / Dynamic Dispatch Sven Efftinge - itemis AG
  • 97. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien Sven Efftinge - itemis AG
  • 98. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien • Ersetzt das Visitor-Pattern Sven Efftinge - itemis AG
  • 99. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien • Ersetzt das Visitor-Pattern • Ersetzt viele ‘instanceof’ Abfragen Sven Efftinge - itemis AG
  • 100. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien • Ersetzt das Visitor-Pattern • Ersetzt viele ‘instanceof’ Abfragen • Auch sehr nett in Kombination mit “Extension Methods” foo.staticMethod() statt staticMethod(foo) Sven Efftinge - itemis AG
  • 101. Metaprogramming Dynamischen Code in statische getypter Sprache?
  • 102. Dynamische Programmierung Sven Efftinge - itemis AG
  • 103. Dynamische Programmierung • Inspektion • Reflection API Sven Efftinge - itemis AG
  • 104. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! Sven Efftinge - itemis AG
  • 105. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! • Dynamisch Klassen und Methoden ändern Sven Efftinge - itemis AG
  • 106. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! • Dynamisch Klassen und Methoden ändern • Scripting Sven Efftinge - itemis AG
  • 107. Dynamisch Methoden Aufrufen public Object getName(Object myObj) { Class<?> myClass = myObj.getClass(); try { In Java : Method method = myClass.getMethod(quot;getNamequot;); return method.invoke(myObj); } catch (Exception e) { // handle exception } return null; } Sven Efftinge - itemis AG
  • 108. Dynamisch Methoden Aufrufen public getName(Object myObj) { In Groovy : return myObj.getName(); } Sven Efftinge - itemis AG
  • 109. Statische Typisierung Sven Efftinge - itemis AG
  • 110. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) Sven Efftinge - itemis AG
  • 111. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf Sven Efftinge - itemis AG
  • 112. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf •Kein Widerspruch zu Sven Efftinge - itemis AG
  • 113. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf •Kein Widerspruch zu •Kurzen Turn-Arounds Sven Efftinge - itemis AG
  • 114. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf •Kein Widerspruch zu •Kurzen Turn-Arounds •Interaktiver Entwicklung Sven Efftinge - itemis AG
  • 115. Statische Typisierung Sven Efftinge - itemis AG
  • 116. Statische Typisierung •Kein Ersatz für Unittests Sven Efftinge - itemis AG
  • 117. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität Sven Efftinge - itemis AG
  • 118. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität •statische vs. dynamische Typen Sven Efftinge - itemis AG
  • 119. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität •statische vs. dynamische Typen •Generics Sven Efftinge - itemis AG
  • 120. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität •statische vs. dynamische Typen •Generics •oft umständliche, generische Programmierung via Reflection Sven Efftinge - itemis AG
  • 121. Warum nicht beides? Sven Efftinge - itemis AG
  • 122. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden Sven Efftinge - itemis AG
  • 123. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden • Dynamische Programmierung eher in der Framework-Entwicklung Sven Efftinge - itemis AG
  • 124. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden • Dynamische Programmierung eher in der Framework-Entwicklung • z.B. durch explizite CompilerEscapes : foo.~unkownMethod() Sven Efftinge - itemis AG
  • 125. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden • Dynamische Programmierung eher in der Framework-Entwicklung • z.B. durch explizite CompilerEscapes : foo.~unkownMethod() • Casts nicht im ByteCode Sven Efftinge - itemis AG
  • 126. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden • Dynamische Programmierung eher in der Framework-Entwicklung • z.B. durch explizite CompilerEscapes : foo.~unkownMethod() • Casts nicht im ByteCode • methodMissing() Methode auf java.lang.Object Sven Efftinge - itemis AG
  • 127. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden • Dynamische Programmierung eher in der Framework-Entwicklung • z.B. durch explizite CompilerEscapes : foo.~unkownMethod() • Casts nicht im ByteCode • methodMissing() Methode auf java.lang.Object • Zur Laufzeit Methoden und Klassen hinzufügen Sven Efftinge - itemis AG
  • 129. Was nervt ... Sven Efftinge - itemis AG
  • 130. Was nervt ... •Checked Exceptions Sven Efftinge - itemis AG
  • 131. Was nervt ... •Checked Exceptions •Native Datentypen Sven Efftinge - itemis AG
  • 132. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement Sven Efftinge - itemis AG
  • 133. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement •Arrays Sven Efftinge - itemis AG
  • 134. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement •Arrays •Built-in Operatoren Sven Efftinge - itemis AG
  • 135. Java ist super! Sven Efftinge - itemis AG
  • 136. Java ist super! •Open-Source Community Sven Efftinge - itemis AG
  • 137. Java ist super! •Open-Source Community •Die Virtual Machine Sven Efftinge - itemis AG
  • 138. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) Sven Efftinge - itemis AG
  • 139. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) •Einfachheit Sven Efftinge - itemis AG
  • 140. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) •Einfachheit •Statische Typisierung Sven Efftinge - itemis AG
  • 141.
  • 142. Vielen Dank für Ihre Aufmerksamkeit Noch Fragen?