Vermisste Sprachfeatures in Java (german)
-
Upload
sven-efftinge -
Category
Technology
-
view
1.331 -
download
0
Transcript of Vermisste Sprachfeatures in Java (german)
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?