Sven Efftinge - itemis AG


Vermisste Sprachfeatures in Java
Vorab




        Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand




                             Sven Efftinge - itemis AG
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?




                                      ...
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösunge...
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösunge...
Vorab

•Blick über den Tellerrand

•Welche Probleme lösen wir auf welche Weise?

•Wann und warum nutzen wir andere Lösunge...
Properties
machen Code kürzer, prägnanter und damit besser wartbar
Kommt Ihnen das bekannt vor?




                               Sven Efftinge - itemis AG
Kommt Ihnen das bekannt vor?



            public class Customer {
              private String name;
              publi...
Kommt Ihnen das bekannt vor?
public class Customer {
  private String name;
  public String getName() {
    return name;
 ...
Kommt Ihnen das bekannt vor?
public class Customer {
  private String name;
  public String getName() {
    return name;
 ...
Warum nicht einfach Felder benutzen?


 public class Customer {
   public String name;
 }


                           ......
Warum nicht einfach Felder benutzen?
    public class Customer {
      public String name;
    }
                         ...
Mit “Properties”




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

                          ...
Mit “Properties”
public class Customer {
  property String name;
                              ... und ...
}


           ...
Mit “Properties”




Beispiel für read-only Property mit speziellem Setter
                      public class Customer {
 ...
Type Inference
macht den Code leserlicher, wartbarer und reduziert Komplexität
Ein typisches Stück Javacode


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList<...
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList<Person>();
  f...
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(Perso...
Type Inference


public List<Person> withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(p : l...
Type Inference


public withoutEmil(List<Person> list) {
  List<Person> result = new ArrayList();
  for(p : list) {
    if...
Type Inference in Java 7?




                            Sven Efftinge - itemis AG
Type Inference in Java 7?

// Variablen Deklaration




                            Sven Efftinge - itemis AG
Type Inference in Java 7?

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




            ...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Type Inference in Java 7?

// Variablen Deklaration
Map<String, List<Person>> families = new HashMap<>();
var families = n...
Multiline Stringliterale
macht den Code leserlicher und wartbarer - ersetzt externe Lösungen
Neulich beim Testen....
public void testConfig() throws Exception {

 Configuration c = parse(
           quot;<config> quot;...
Besser:
public void testConfig() throws Exception {

 Configuration c = parse(
	 	 quot;quot;quot;<config>
	 	 	 <bean class=...
Anwendungsfälle für Multiline Stringliterale




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

•Textuelle Testdaten




                                        Sven Efftin...
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung




                                 ...
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)...
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)...
Anwendungsfälle für Multiline Stringliterale

•Textuelle Testdaten

•Codegenerierung

•HTML/XML Erzeugung (Servlets, etc.)...
Multiline Stringliterale “selbstgebaut”
public void testConfig() throws Exception {

 Configuration c = parse(
    S(/*<confi...
Multiline Stringliterale “selbstgebaut”

public static String S() {
    StackTraceElement element = new RuntimeException()...
Initializer
macht strukturellen Code deklarativ und damit leserlicher
ersetzt externe Lösungen (z.B. XML)
Java ist objektorientiert, oder?




                                   Sven Efftinge - itemis AG
Java ist objektorientiert, oder?
Customer c = new Customer();
c.setName(quot;foobarquot;);
c.setId(4711);
		
Address addre...
Aktuell bevorzugter Weg
<Customer
   name=quot;foobarquot;
   id=”4711”>
  <address>
     <Address
       street=”Schauenb...
So könnte es aussehen...

Customer c = new Customer {
   name = quot;foobarquot;;
   id        = 4711;
   address = new Ad...
Initializer in anderen Sprachen
• Builder in Groovy


• Modelltransformationssprachen (ATL, QVT)


• In C# sieht’s so aus:...
Übrigens so geht es auch schon heute...
Customer c = new Customer() {{
    name = quot;foobarquot;;
    id       = 4711;
 ...
Übrigens so geht es auch schon heute...
Customer c = new Customer() {{
    name = quot;foobarquot;;
    id       = 4711;
 ...
Literale für Collections
macht strukturellen Code deklarativ und damit leserlicher
Collections sind allgegenwärtig




                                  Sven Efftinge - itemis AG
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich....
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich....
Collections sind allgegenwärtig
Map<String,Person> personByName = new HashMap<String,Person>();
personByName.put(heinrich....
Collectionliteral in C#
Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
   { 111, new Student...
Collectionliteral in C#
Dictionary<int, StudentName> students = new Dictionary<int, StudentName>()
{
   { 111, new Student...
Collection-Literale in Java

 import static java.util.Arrays.asList;

 class Foo {
   List<String> createList() {
      re...
Collection-Literale in Java

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

class Foo {
  List<String, int> createMap() ...
Collection-Literale in Java




          Eine Proposal für eine Spracherweiterung
                      gibt es z.B. unte...
Anonymous Types
Strukturierte Sichten auf Datenbestände
Anonyme Datenstrukturen erzeugen

var students = new Map<>()
  {
    111 => new {firstName=quot;Sachinquot;, lastName=quot;...
Anonyme Datenstrukturen erzeugen

var students = new Map<>()
  {
    111 => new {firstName=quot;Sachinquot;, lastName=quot;...
Closures
Neue Kontrollstrukturen per Library
Typischer Javacode




                     Sven Efftinge - itemis AG
Typischer Javacode

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

 List<Person> result = new ArrayList<Pe...
Das Selbe mit Closures




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

 return persons.select({p => p.g...
Das Selbe mit Closures
List<Person> filterByName(List<Person> persons, String name) {

 return persons.select({p => p.getNa...
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 ...
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung ...
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung ...
Closure: Anonyme Funktion
• Ein Literal für Funktionen


• Speichert den Umgebenden Kontext und greift bei der Ausführung ...
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...
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte...
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte...
Typische Higher-Order Functions auf Mengen
• List<T> select({T => boolean} func)
  Gibt eine neue Liste, die nur die Werte...
Resourcehandling




                   Sven Efftinge - itemis AG
Resourcehandling

 FileInputStream input = new FileInputStream(fileName);
 try {
 
 // use input
 } finally {
    try {
 
 
...
Resourcehandling mit Closures




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

 // use input
});




                      ...
Resourcehandling mit Closures
with(new FileInputStream(fileName), { in =>

 // use input
});
void with(FileInputStream in, ...
Dynamic Dispatch / Multimethods
Visitors, switches, etc. adé
Polymorphismus in Java

class Foo {
  void doStuff() {
     System.out.println(“foo”);             Foo
  }
}
class Special...
Polymorphismus in Java

new SpecialFoo().doStuff();
((Foo) new SpecialFoo()).doStuff();
                                  ...
Polymorphismus in Java

new SpecialFoo().doStuff();
((Foo) new SpecialFoo()).doStuff();
                                  ...
Polymorphismus in Java (2)

class Foo {
}
class SpecialFoo extends Foo {
}
static void doStuff(SpecialFoo arg) {
  System....
Polymorphismus in Java (2)

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


class Foo {
}
class SpecialFoo e...
Polymorphismus in Java (2)

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

output:
specialfoo
foo




      ...
Mit Dynamic Dispatch in Java

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

output:
specialfoo
specialfoo


...
Dynamic Dispatch in Java (2)

class Foo {
  //....
   public boolean equals(Object arg) {
        if (arg instanceof Foo) ...
Dynamic Dispatch in Java (2)

class Foo {
  //...
   public boolean equals(Foo arg) {
        return name.equals(arg.name)...
Multimethod / Dynamic Dispatch




                                 Sven Efftinge - itemis AG
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien




                         ...
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Patter...
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Patter...
Multimethod / Dynamic Dispatch

• Non-Invasive und polymorphe Erweiterung von Typhierarchien

• Ersetzt das Visitor-Patter...
Metaprogramming
Dynamischen Code in statische getypter Sprache?
Dynamische Programmierung




                            Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API




                            Sven Efftinge - itemis AG
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlic...
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlic...
Dynamische Programmierung

• Inspektion

  • Reflection API

• Dynamisch Methoden aufrufen

  • Reflection API -> Umständlic...
Dynamisch Methoden Aufrufen



                   public Object getName(Object myObj) {
               	     	     Class<?...
Dynamisch Methoden Aufrufen




                    public getName(Object myObj) {
  In Groovy :               return myOb...
Statische Typisierung




                        Sven Efftinge - itemis AG
Statische Typisierung

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




                                           Sven Efftin...
Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf




           ...
Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspr...
Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspr...
Statische Typisierung

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

•Die Werkzeugunterstützung basiert darauf

•Kein Widerspr...
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 - i...
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen




            ...
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen

 •Generics




...
Statische Typisierung

•Kein Ersatz für Unittests

•Erhöhte Komplexität

 •statische vs. dynamische Typen

 •Generics

•of...
Warum nicht beides?




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




                             ...
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung ehe...
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung ehe...
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung ehe...
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung ehe...
Warum nicht beides?
• Die allermeisten Codezeilen können sinnvoll statisch getypt werden


• Dynamische Programmierung ehe...
Verschiedenes
Was nervt ...




                Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen




                      Sven Efftinge - itemis AG
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement




                      Sven Efftinge - itemis...
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays




                      Sven Efftinge...
Was nervt ...

•Checked Exceptions

•Native Datentypen

•Switch statement

•Arrays

•Built-in Operatoren



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




                 ...
Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit




   ...
Java ist super!

•Open-Source Community

•Die Virtual Machine

•Die Werkzeuge (insbesondere Eclipse)

•Einfachheit

•Stati...
Vielen Dank für Ihre Aufmerksamkeit

Noch Fragen?
Vermisste Sprachfeatures in Java (german)
Upcoming SlideShare
Loading in...5
×

Vermisste Sprachfeatures in Java (german)

1,358

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,358
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
16
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Vermisste Sprachfeatures in Java (german)

  1. 1. Sven Efftinge - itemis AG Vermisste Sprachfeatures in Java
  2. 2. Vorab Sven Efftinge - itemis AG
  3. 3. Vorab •Blick über den Tellerrand Sven Efftinge - itemis AG
  4. 4. Vorab •Blick über den Tellerrand •Welche Probleme lösen wir auf welche Weise? Sven Efftinge - itemis AG
  5. 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. 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. 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. 8. Properties machen Code kürzer, prägnanter und damit besser wartbar
  9. 9. Kommt Ihnen das bekannt vor? Sven Efftinge - itemis AG
  10. 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. 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. 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. 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. 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. 15. Mit “Properties” • http://weblogs.java.net/blog/forax/archive/2007/01/property_reload.html Sven Efftinge - itemis AG
  16. 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. 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. 18. Type Inference macht den Code leserlicher, wartbarer und reduziert Komplexität
  19. 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. 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. 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. 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. 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. 24. Type Inference in Java 7? Sven Efftinge - itemis AG
  25. 25. Type Inference in Java 7? // Variablen Deklaration Sven Efftinge - itemis AG
  26. 26. Type Inference in Java 7? // Variablen Deklaration Map<String, List<Person>> families = new HashMap<>(); Sven Efftinge - itemis AG
  27. 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. 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. 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. 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. 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. 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. 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. 34. Multiline Stringliterale macht den Code leserlicher und wartbarer - ersetzt externe Lösungen
  35. 35. Neulich beim Testen.... public void testConfig() throws Exception { Configuration c = parse( quot;<config> quot; + quot; <bean class=quot;quot;+ Foobar.class.getName()+quot;quot;>quot;+ quot; <someProp value=quot;foobarquot;/>quot;+ quot; </bean>quot;+ quot;</config>quot;); assertEquals(quot;foobarquot;, c.getBeans().get(0).get(quot;somePropquot;)); } Sven Efftinge - itemis AG
  36. 36. Besser: public void testConfig() throws Exception { Configuration c = parse( quot;quot;quot;<config> <bean class=quot;${Foobar.class.getName()}quot;> <someProp value=quot;foobarquot;/> </bean> </config>quot;quot;quot;); assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;)); } Sven Efftinge - itemis AG
  37. 37. Anwendungsfälle für Multiline Stringliterale Sven Efftinge - itemis AG
  38. 38. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten Sven Efftinge - itemis AG
  39. 39. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung Sven Efftinge - itemis AG
  40. 40. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung •HTML/XML Erzeugung (Servlets, etc.) Sven Efftinge - itemis AG
  41. 41. Anwendungsfälle für Multiline Stringliterale •Textuelle Testdaten •Codegenerierung •HTML/XML Erzeugung (Servlets, etc.) •Serienbriefe Sven Efftinge - itemis AG
  42. 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. 43. Multiline Stringliterale “selbstgebaut” public void testConfig() throws Exception { Configuration c = parse( S(/*<config> <bean class=quot;${Foobar.class.getName()}quot;> <someProp value=quot;foobarquot;/> </bean> </config>*/)); assertEquals(quot;foobarquot;,c.getBeans().get(0).get(quot;somePropquot;)); } author - company
  44. 44. Multiline Stringliterale “selbstgebaut” public static String S() { StackTraceElement element = new RuntimeException().getStackTrace()[1]; String name = element.getClassName().replace('.', '/') + quot;.javaquot;; InputStream in = getClassLoader().getResourceAsStream(name); String s = convertStreamToString(in, element.getLineNumber()); return s.substring(s.indexOf(quot;/*quot;)+2, s.indexOf(quot;*/quot;)); } author - company
  45. 45. Initializer macht strukturellen Code deklarativ und damit leserlicher ersetzt externe Lösungen (z.B. XML)
  46. 46. Java ist objektorientiert, oder? Sven Efftinge - itemis AG
  47. 47. Java ist objektorientiert, oder? Customer c = new Customer(); c.setName(quot;foobarquot;); c.setId(4711); Address address = new Address(); address.setStreet(quot;Schauenburgerstr. 116quot;); address.setZip(quot;24118quot;); address.setCity(quot;Kielquot;); c.setAddress(address); Order o1 = new Order(); o1.setArticleId(0815); o1.setAmount(2); c.addOrder(o1); Sven Efftinge - itemis AG
  48. 48. Aktuell bevorzugter Weg <Customer name=quot;foobarquot; id=”4711”> <address> <Address street=”Schauenburgerstr. 116” zip=”24118” city=”Kiel”/> </address> <orders> <Order articleId=”0815” amount=”2”/> </orders> </Customer> Sven Efftinge - itemis AG
  49. 49. So könnte es aussehen... Customer c = new Customer { name = quot;foobarquot;; id = 4711; address = new Address { street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }; addOrder(new Order { articleId = 0815; amount = 2; }); }; Sven Efftinge - itemis AG
  50. 50. Initializer in anderen Sprachen • Builder in Groovy • Modelltransformationssprachen (ATL, QVT) • In C# sieht’s so aus: Person person = new Person { FirstName = quot;Scottquot;, LastName = quot;Guthriequot;, Age = 32, Address = new Address { Street = quot;One Microsoft Wayquot;, City = quot;Redmondquot;, State = quot;WAquot;, Zip = 98052 } }; Sven Efftinge - itemis AG
  51. 51. Übrigens so geht es auch schon heute... Customer c = new Customer() {{ name = quot;foobarquot;; id = 4711; address = new Address() {{ street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }}; addOrder(new Order() {{ articleId = 0815; amount = 2; }}); }}; Sven Efftinge - itemis AG
  52. 52. Übrigens so geht es auch schon heute... Customer c = new Customer() {{ name = quot;foobarquot;; id = 4711; address = new Address() {{ street = quot;Schauenburgerstr. 116quot;; zip = quot;24118quot;; city = quot;Kielquot;; }}; addOrder(new Order() {{ articleId = 0815; amount = 2; }}); }}; Kombination aus Anonymen Klassen und den “alten” non-static initializers Sven Efftinge - itemis AG
  53. 53. Literale für Collections macht strukturellen Code deklarativ und damit leserlicher
  54. 54. Collections sind allgegenwärtig Sven Efftinge - itemis AG
  55. 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. 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. 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. 58. Collectionliteral in C# Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}}, { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}}, { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}} }; Sven Efftinge - itemis AG
  59. 59. Collectionliteral in C# Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName=quot;Sachinquot;, LastName=quot;Karnikquot;, ID=211}}, { 112, new StudentName {FirstName=quot;Dinaquot;, LastName=quot;Salimzianovaquot;, ID=317}}, { 113, new StudentName {FirstName=quot;Andyquot;, LastName=quot;Ruthquot;, ID=198}} }; In Kombination mit den zuvor genannten Erweiterungen könnte es in Java so aussehen: var students = new HashMap<>() { 111 => new StudentName {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, id=211}, 112 => new StudentName {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, id=317}, 113 => new StudentName {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, id=198} }; Sven Efftinge - itemis AG
  60. 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. 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. 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. 63. Anonymous Types Strukturierte Sichten auf Datenbestände
  64. 64. Anonyme Datenstrukturen erzeugen var students = new Map<>() { 111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211}, 112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317}, 113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989} }; Sven Efftinge - itemis AG
  65. 65. Anonyme Datenstrukturen erzeugen var students = new Map<>() { 111 => new {firstName=quot;Sachinquot;, lastName=quot;Karnikquot;, ID=211}, 112 => new {firstName=quot;Dinaquot;, lastName=quot;Salimzianovaquot;, ID=317}, 113 => new {firstName=quot;Andyquot;, lastName=quot;Ruthquot;, ID=1989} }; Map<Int, AnonymousType<firstName::String,lastName::String,ID::Int>> Typinferenz ist unbedingt erforderlich Sven Efftinge - itemis AG
  66. 66. Closures Neue Kontrollstrukturen per Library
  67. 67. Typischer Javacode Sven Efftinge - itemis AG
  68. 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. 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. 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. 71. Closure: Anonyme Funktion Sven Efftinge - itemis AG
  72. 72. Closure: Anonyme Funktion • Ein Literal für Funktionen Sven Efftinge - itemis AG
  73. 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. 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. 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. 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. 77. Typische Higher-Order Functions auf Mengen Sven Efftinge - itemis AG
  78. 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. 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. 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. 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. 82. Resourcehandling Sven Efftinge - itemis AG
  83. 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. 84. Resourcehandling mit Closures with(new FileInputStream(fileName), { in => // use input }); Sven Efftinge - itemis AG
  85. 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. 86. Dynamic Dispatch / Multimethods Visitors, switches, etc. adé
  87. 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. 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. 89. Polymorphismus in Java new SpecialFoo().doStuff(); ((Foo) new SpecialFoo()).doStuff(); Foo output: specialfoo specialfoo SpecialFoo Sven Efftinge - itemis AG
  90. 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. 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. 92. Polymorphismus in Java (2) doStuff(new SpecialFoo()); doStuff((Foo) new SpecialFoo()); output: specialfoo foo Sven Efftinge - itemis AG
  93. 93. Mit Dynamic Dispatch in Java doStuff(new SpecialFoo()); doStuff((Foo) new SpecialFoo(); output: specialfoo specialfoo Sven Efftinge - itemis AG
  94. 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. 95. Dynamic Dispatch in Java (2) class Foo { //... public boolean equals(Foo arg) { return name.equals(arg.name); } } Sven Efftinge - itemis AG
  96. 96. Multimethod / Dynamic Dispatch Sven Efftinge - itemis AG
  97. 97. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien Sven Efftinge - itemis AG
  98. 98. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien • Ersetzt das Visitor-Pattern Sven Efftinge - itemis AG
  99. 99. Multimethod / Dynamic Dispatch • Non-Invasive und polymorphe Erweiterung von Typhierarchien • Ersetzt das Visitor-Pattern • Ersetzt viele ‘instanceof’ Abfragen Sven Efftinge - itemis AG
  100. 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. 101. Metaprogramming Dynamischen Code in statische getypter Sprache?
  102. 102. Dynamische Programmierung Sven Efftinge - itemis AG
  103. 103. Dynamische Programmierung • Inspektion • Reflection API Sven Efftinge - itemis AG
  104. 104. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! Sven Efftinge - itemis AG
  105. 105. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! • Dynamisch Klassen und Methoden ändern Sven Efftinge - itemis AG
  106. 106. Dynamische Programmierung • Inspektion • Reflection API • Dynamisch Methoden aufrufen • Reflection API -> Umständlich! • Dynamisch Klassen und Methoden ändern • Scripting Sven Efftinge - itemis AG
  107. 107. Dynamisch Methoden Aufrufen public Object getName(Object myObj) { Class<?> myClass = myObj.getClass(); try { In Java : Method method = myClass.getMethod(quot;getNamequot;); return method.invoke(myObj); } catch (Exception e) { // handle exception } return null; } Sven Efftinge - itemis AG
  108. 108. Dynamisch Methoden Aufrufen public getName(Object myObj) { In Groovy : return myObj.getName(); } Sven Efftinge - itemis AG
  109. 109. Statische Typisierung Sven Efftinge - itemis AG
  110. 110. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) Sven Efftinge - itemis AG
  111. 111. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf Sven Efftinge - itemis AG
  112. 112. Statische Typisierung •Grundsätzlich sehr nützlich (Feedback!) •Die Werkzeugunterstützung basiert darauf •Kein Widerspruch zu Sven Efftinge - itemis AG
  113. 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. 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. 115. Statische Typisierung Sven Efftinge - itemis AG
  116. 116. Statische Typisierung •Kein Ersatz für Unittests Sven Efftinge - itemis AG
  117. 117. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität Sven Efftinge - itemis AG
  118. 118. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität •statische vs. dynamische Typen Sven Efftinge - itemis AG
  119. 119. Statische Typisierung •Kein Ersatz für Unittests •Erhöhte Komplexität •statische vs. dynamische Typen •Generics Sven Efftinge - itemis AG
  120. 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. 121. Warum nicht beides? Sven Efftinge - itemis AG
  122. 122. Warum nicht beides? • Die allermeisten Codezeilen können sinnvoll statisch getypt werden Sven Efftinge - itemis AG
  123. 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. 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. 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. 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. 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. 128. Verschiedenes
  129. 129. Was nervt ... Sven Efftinge - itemis AG
  130. 130. Was nervt ... •Checked Exceptions Sven Efftinge - itemis AG
  131. 131. Was nervt ... •Checked Exceptions •Native Datentypen Sven Efftinge - itemis AG
  132. 132. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement Sven Efftinge - itemis AG
  133. 133. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement •Arrays Sven Efftinge - itemis AG
  134. 134. Was nervt ... •Checked Exceptions •Native Datentypen •Switch statement •Arrays •Built-in Operatoren Sven Efftinge - itemis AG
  135. 135. Java ist super! Sven Efftinge - itemis AG
  136. 136. Java ist super! •Open-Source Community Sven Efftinge - itemis AG
  137. 137. Java ist super! •Open-Source Community •Die Virtual Machine Sven Efftinge - itemis AG
  138. 138. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) Sven Efftinge - itemis AG
  139. 139. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) •Einfachheit Sven Efftinge - itemis AG
  140. 140. Java ist super! •Open-Source Community •Die Virtual Machine •Die Werkzeuge (insbesondere Eclipse) •Einfachheit •Statische Typisierung Sven Efftinge - itemis AG
  141. 141. Vielen Dank für Ihre Aufmerksamkeit Noch Fragen?
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×