Vermisste Sprachfeatures in Java (german)

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

    Vermisste Sprachfeatures in Java (german) - Presentation Transcript

    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
    15. Mit “Properties” • http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html 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( \"<config> \" + \" <bean class=\\\"\"+ Foobar.class.getName()+\"\\\">\"+ \" <someProp value=\\\"foobar\\\"/>\"+ \" </bean>\"+ \"</config>\"); assertEquals(\"foobar\", c.getBeans().get(0).get(\"someProp\")); } Sven Efftinge - itemis AG
    36. 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
    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=\"${Foobar.class.getName()}\"> <someProp value=\"foobar\"/> </bean> </config>*/)); assertEquals(\"foobar\",c.getBeans().get(0).get(\"someProp\")); } author - company
    44. 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(\"*/\")); } 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(\"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
    48. 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
    49. 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
    50. 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
    51. Ü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
    52. Ü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 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=\"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
    59. 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
    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
    63. Anonymous Types Strukturierte Sichten auf Datenbestände
    64. 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
    65. 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 Sven Efftinge - itemis AG
    66. Closures Neue Kontrollstrukturen per Library
    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(\"getName\"); 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
    128. Verschiedenes
    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. Vielen Dank für Ihre Aufmerksamkeit Noch Fragen?

    + sefftingesefftinge, 8 months ago

    custom

    850 views, 0 favs, 2 embeds more stats

    More Info

    © All Rights Reserved

    Go to text version
    • Total Views 850
      • 819 on SlideShare
      • 31 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 6
    Most viewed embeds
    • 29 views on http://www.itemis.de
    • 2 views on https://onion.net

    more

    All embeds
    • 29 views on http://www.itemis.de
    • 2 views on https://onion.net

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as innappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel

    Categories

    Tags