142
Sven Efftinge - itemis AG Vermisste Sprachfeatures in Java

Vermisste Sprachfeatures in Java (german)

Embed Size (px)

Citation preview

Page 1: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Vermisste Sprachfeatures in Java

Page 2: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Vorab

Page 3: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Vorab

•Blick über den Tellerrand

Page 4: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

Page 5: Vermisste Sprachfeatures in Java (german)

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)?

Page 6: Vermisste Sprachfeatures in Java (german)

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

Page 7: Vermisste Sprachfeatures in Java (german)

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

Page 8: Vermisste Sprachfeatures in Java (german)

Properties

machen Code kürzer, prägnanter und damit besser wartbar

Page 9: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Kommt Ihnen das bekannt vor?

Page 10: Vermisste Sprachfeatures in Java (german)

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; }}

Page 11: Vermisste Sprachfeatures in Java (german)

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();

Page 12: Vermisste Sprachfeatures in Java (german)

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();

Page 13: Vermisste Sprachfeatures in Java (german)

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;

Page 14: Vermisste Sprachfeatures in Java (german)

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

Page 15: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Mit “Properties”

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

Page 16: Vermisste Sprachfeatures in Java (german)

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

Page 17: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Mit “Properties”

public class Customer { property String name set { if (val!=null) this.name = val; };}

Beispiel für read-only Property mit speziellem Setter

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

Page 18: Vermisste Sprachfeatures in Java (german)

Type Inference

macht den Code leserlicher, wartbarer und reduziert Komplexität

Page 19: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

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;}

Page 20: Vermisste Sprachfeatures in Java (german)

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

Page 21: Vermisste Sprachfeatures in Java (german)

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

Page 22: Vermisste Sprachfeatures in Java (german)

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

Page 23: Vermisste Sprachfeatures in Java (german)

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;}

Page 24: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

Page 25: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

// Variablen Deklaration

Page 26: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

Page 27: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

Page 28: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

Page 29: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

// Ableiten aus dem Methodenkontext

Page 30: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

// Ableiten aus dem MethodenkontexttimeWaitsFor(new HashSet<>());

Page 31: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

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

Page 32: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

// Ableiten aus dem MethodenkontexttimeWaitsFor(new HashSet<>());// oder auchtimeWaitsFor(Collections.emptySet());

Page 33: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

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

Page 34: Vermisste Sprachfeatures in Java (german)

Multiline Stringliterale

macht den Code leserlicher und wartbarer - ersetzt externe Lösungen

Page 35: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Neulich beim Testen....

public void testConfig() throws Exception { Configuration c = parse( "<config> " + " <bean class=\""+ Foobar.class.getName()+"\">"+ " <someProp value=\"foobar\"/>"+ " </bean>"+ "</config>"); assertEquals("foobar", c.getBeans().get(0).get("someProp"));}

Page 36: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Besser:

public void testConfig() throws Exception { Configuration c = parse( """<config> <bean class="${Foobar.class.getName()}"> <someProp value="foobar"/> </bean> </config>"""); assertEquals("foobar",c.getBeans().get(0).get("someProp"));}

Page 37: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anwendungsfälle für Multiline Stringliterale

Page 38: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

Page 39: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

Page 40: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)

Page 41: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)

•Serienbriefe

Page 42: Vermisste Sprachfeatures in Java (german)

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)

Page 43: Vermisste Sprachfeatures in Java (german)

author - company

Multiline Stringliterale “selbstgebaut”

public void testConfig() throws Exception { Configuration c = parse( S(/*<config> <bean class="${Foobar.class.getName()}"> <someProp value="foobar"/> </bean> </config>*/)); assertEquals("foobar",c.getBeans().get(0).get("someProp"));}

Page 44: Vermisste Sprachfeatures in Java (german)

author - company

Multiline Stringliterale “selbstgebaut”

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

Page 45: Vermisste Sprachfeatures in Java (german)

Initializer

macht strukturellen Code deklarativ und damit leserlicherersetzt externe Lösungen (z.B. XML)

Page 46: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist objektorientiert, oder?

Page 47: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist objektorientiert, oder?

Customer c = new Customer();c.setName("foobar");c.setId(4711); Address address = new Address();address.setStreet("Schauenburgerstr. 116");address.setZip("24118");address.setCity("Kiel"); c.setAddress(address); Order o1 = new Order();o1.setArticleId(0815);o1.setAmount(2);c.addOrder(o1);

Page 48: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Aktuell bevorzugter Weg

<Customer name="foobar" id=”4711”>

<address><Address

street=”Schauenburgerstr. 116”zip=”24118”city=”Kiel”/>

</address><orders>

<Order articleId=”0815”amount=”2”/>

</orders></Customer>

Page 49: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

So könnte es aussehen...

Customer c = new Customer {name = "foobar";id = 4711;address = new Address {

street = "Schauenburgerstr. 116";zip = "24118";city = "Kiel";

};addOrder(new Order {

articleId = 0815;amount = 2;

});};

Page 50: Vermisste Sprachfeatures in Java (german)

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 = "Scott", LastName = "Guthrie", Age = 32, Address = new Address { Street = "One Microsoft Way", City = "Redmond", State = "WA", Zip = 98052 } };

Page 51: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Übrigens so geht es auch schon heute...

Customer c = new Customer() {{name = "foobar";id = 4711;address = new Address() {{

street = "Schauenburgerstr. 116";zip = "24118";city = "Kiel";

}};addOrder(new Order() {{

articleId = 0815;amount = 2;

}});}};

Page 52: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Übrigens so geht es auch schon heute...

Customer c = new Customer() {{name = "foobar";id = 4711;address = new Address() {{

street = "Schauenburgerstr. 116";zip = "24118";city = "Kiel";

}};addOrder(new Order() {{

articleId = 0815;amount = 2;

}});}};

Kombination aus Anonymen Klassen und den “alten” non-static initializers

Page 53: Vermisste Sprachfeatures in Java (german)

Literale für Collections

macht strukturellen Code deklarativ und damit leserlicher

Page 54: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Collections sind allgegenwärtig

Page 55: Vermisste Sprachfeatures in Java (german)

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);

Page 56: Vermisste Sprachfeatures in Java (german)

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};

Page 57: Vermisste Sprachfeatures in Java (german)

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 aussehenvar personByName = new HashMap<>() {

heinrich.getName() => heinrich,maria.getName() => maria,horst.getName() => horst};

Page 58: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Collectionliteral in C#

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>(){ { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}}, { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}}, { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}};

Page 59: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Collectionliteral in C#

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>(){ { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}}, { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}}, { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}};

In Kombination mit den zuvor genannten Erweiterungen könnte es in Java so aussehen:

var students = new HashMap<>() { 111 => new StudentName {firstName="Sachin", lastName="Karnik", id=211}, 112 => new StudentName {firstName="Dina", lastName="Salimzianova", id=317}, 113 => new StudentName {firstName="Andy", lastName="Ruth", id=198}};

Page 60: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Collection-Literale in Java

import static java.util.Arrays.asList;

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

Page 61: Vermisste Sprachfeatures in Java (german)

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

Page 62: Vermisste Sprachfeatures in Java (german)

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

Collection-Literale in Java

Page 63: Vermisste Sprachfeatures in Java (german)

Anonymous Types

Strukturierte Sichten auf Datenbestände

Page 64: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anonyme Datenstrukturen erzeugen

var students = new Map<>() { 111 => new {firstName="Sachin", lastName="Karnik", ID=211}, 112 => new {firstName="Dina", lastName="Salimzianova", ID=317}, 113 => new {firstName="Andy", lastName="Ruth", ID=1989} };

Page 65: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Anonyme Datenstrukturen erzeugen

var students = new Map<>() { 111 => new {firstName="Sachin", lastName="Karnik", ID=211}, 112 => new {firstName="Dina", lastName="Salimzianova", ID=317}, 113 => new {firstName="Andy", lastName="Ruth", ID=1989} };

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

Typinferenz ist unbedingt erforderlich

Page 66: Vermisste Sprachfeatures in Java (german)

Closures

Neue Kontrollstrukturen per Library

Page 67: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Typischer Javacode

Page 68: Vermisste Sprachfeatures in Java (german)

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;}

Page 69: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Das Selbe mit Closures

List<Person> filterByName(List<Person> persons, String name) { return persons.select({p => p.getName().equals(name)});}

Page 70: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Das Selbe mit Closures

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;}

List<Person> filterByName(List<Person> persons, String name) { return persons.select({p => p.getName().equals(name)});}

Page 71: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Closure: Anonyme Funktion

Page 72: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Closure: Anonyme Funktion

• Ein Literal für Funktionen

Page 73: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Closure: Anonyme Funktion

• Ein Literal für Funktionen

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

Page 74: Vermisste Sprachfeatures in Java (german)

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”)}

Page 75: Vermisste Sprachfeatures in Java (german)

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

Page 76: Vermisste Sprachfeatures in Java (german)

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

Block or expression to be executed

Page 77: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Typische Higher-Order Functions auf Mengen

Page 78: Vermisste Sprachfeatures in Java (german)

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.

Page 79: Vermisste Sprachfeatures in Java (german)

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

Page 80: Vermisste Sprachfeatures in Java (german)

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)

Page 81: Vermisste Sprachfeatures in Java (german)

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

Page 82: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Resourcehandling

Page 83: Vermisste Sprachfeatures in Java (german)

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); }}

Page 84: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Resourcehandling mit Closures

with(new FileInputStream(fileName), { in => // use input});

Page 85: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Resourcehandling mit Closureswith(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); } }}

Page 86: Vermisste Sprachfeatures in Java (german)

Dynamic Dispatch / Multimethods

Visitors, switches, etc. adé

Page 87: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Polymorphismus in Java

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

SpecialFoo

Foo

Page 88: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Polymorphismus in Java

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

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

SpecialFoo

Foo

Page 89: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Polymorphismus in Java

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

SpecialFoo

Foooutput:specialfoospecialfoo

Page 90: Vermisste Sprachfeatures in Java (german)

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”);}

Page 91: Vermisste Sprachfeatures in Java (german)

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”);}

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

Page 92: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Polymorphismus in Java (2)

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

output:specialfoofoo

Page 93: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Mit Dynamic Dispatch in Java

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

output:specialfoospecialfoo

Page 94: Vermisste Sprachfeatures in Java (german)

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; }}

Page 95: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamic Dispatch in Java (2)

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

Page 96: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Multimethod / Dynamic Dispatch

Page 97: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

Page 98: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Pattern

Page 99: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Pattern

• Ersetzt viele ‘instanceof’ Abfragen

Page 100: Vermisste Sprachfeatures in Java (german)

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)

Page 101: Vermisste Sprachfeatures in Java (german)

Metaprogramming

Dynamischen Code in statische getypter Sprache?

Page 102: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamische Programmierung

Page 103: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamische Programmierung

• Inspektion

•Reflection API

Page 104: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamische Programmierung

• Inspektion

•Reflection API

•Dynamisch Methoden aufrufen

•Reflection API -> Umständlich!

Page 105: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamische Programmierung

• Inspektion

•Reflection API

•Dynamisch Methoden aufrufen

•Reflection API -> Umständlich!

•Dynamisch Klassen und Methoden ändern

Page 106: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamische Programmierung

• Inspektion

•Reflection API

•Dynamisch Methoden aufrufen

•Reflection API -> Umständlich!

•Dynamisch Klassen und Methoden ändern

•Scripting

Page 107: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamisch Methoden Aufrufen

public Object getName(Object myObj) { Class<?> myClass = myObj.getClass(); try { Method method = myClass.getMethod("getName"); return method.invoke(myObj); } catch (Exception e) { // handle exception } return null; }

In Java :

Page 108: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Dynamisch Methoden Aufrufen

public getName(Object myObj) { return myObj.getName(); }

In Groovy :

Page 109: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

Page 110: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

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

Page 111: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

Page 112: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspruch zu

Page 113: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspruch zu

•Kurzen Turn-Arounds

Page 114: Vermisste Sprachfeatures in Java (german)

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

Page 115: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

Page 116: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

•Kein Ersatz für Unittests

Page 117: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

Page 118: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

•statische vs. dynamische Typen

Page 119: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

•statische vs. dynamische Typen

•Generics

Page 120: Vermisste Sprachfeatures in Java (german)

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

Page 121: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Warum nicht beides?

Page 122: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Warum nicht beides?

• Die allermeisten Codezeilen können sinnvoll statisch getypt werden

Page 123: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Warum nicht beides?

• Die allermeisten Codezeilen können sinnvoll statisch getypt werden

• Dynamische Programmierung eher in der Framework-Entwicklung

Page 124: Vermisste Sprachfeatures in Java (german)

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()

Page 125: Vermisste Sprachfeatures in Java (german)

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

Page 126: Vermisste Sprachfeatures in Java (german)

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

Page 127: Vermisste Sprachfeatures in Java (german)

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

Page 128: Vermisste Sprachfeatures in Java (german)

Verschiedenes

Page 129: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

Page 130: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

•Checked Exceptions

Page 131: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

•Checked Exceptions

•Native Datentypen

Page 132: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

Page 133: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays

Page 134: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays

•Built-in Operatoren

Page 135: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

Page 136: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

•Open-Source Community

Page 137: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

•Open-Source Community

•Die Virtual Machine

Page 138: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

Page 139: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit

Page 140: Vermisste Sprachfeatures in Java (german)

Sven Efftinge - itemis AG

Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit

•Statische Typisierung

Page 141: Vermisste Sprachfeatures in Java (german)
Page 142: Vermisste Sprachfeatures in Java (german)

Vielen Dank für Ihre Aufmerksamkeit

Noch Fragen?