Vermisste Sprachfeatures in Java (german)

Preview:

Citation preview

Sven Efftinge - itemis AG

Vermisste Sprachfeatures in Java

Sven Efftinge - itemis AG

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

Properties

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

Sven Efftinge - itemis AG

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”

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

Type Inference

macht den Code leserlicher, wartbarer und reduziert Komplexität

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

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 DeklarationMap<String, List<Person>> families = new HashMap<>();

Sven Efftinge - itemis AG

Type Inference in Java 7?

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

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

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

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

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

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

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

Multiline Stringliterale

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

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

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

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)

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

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("*/"));}

Initializer

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

Sven Efftinge - itemis AG

Java ist objektorientiert, oder?

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

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>

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;

});};

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

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;

}});}};

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

Literale für Collections

macht strukturellen Code deklarativ und damit leserlicher

Sven Efftinge - itemis AG

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 aussehenvar 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="Sachin", LastName="Karnik", ID=211}}, { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}}, { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}}};

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

Sven Efftinge - itemis AG

Collection-Literale in Java

import static java.util.Arrays.asList;

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

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

Collection-Literale in Java

Anonymous Types

Strukturierte Sichten auf Datenbestände

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

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

Closures

Neue Kontrollstrukturen per Library

Sven Efftinge - itemis AG

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

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 Parameters

Block or expression 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 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); } }}

Dynamic Dispatch / Multimethods

Visitors, switches, etc. adé

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

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

Sven Efftinge - itemis AG

Polymorphismus in Java

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

SpecialFoo

Foooutput:specialfoospecialfoo

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)

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

Sven Efftinge - itemis AG

Polymorphismus in Java (2)

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

output:specialfoofoo

Sven Efftinge - itemis AG

Mit Dynamic Dispatch in Java

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

output:specialfoospecialfoo

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)

Metaprogramming

Dynamischen Code in statische getypter Sprache?

Sven Efftinge - itemis AG

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 { Method method = myClass.getMethod("getName"); return method.invoke(myObj); } catch (Exception e) { // handle exception } return null; }

In Java :

Sven Efftinge - itemis AG

Dynamisch Methoden Aufrufen

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

In Groovy :

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

Verschiedenes

Sven Efftinge - itemis AG

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

Vielen Dank für Ihre Aufmerksamkeit

Noch Fragen?

Recommended