Vermisste Sprachfeatures in Java (german) - Presentation Transcript
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?
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
Sven Efftinge - itemis AG
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;
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”
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
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<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 Deklaration
Map<String, List<Person>> families = new HashMap<>();
Sven Efftinge - itemis AG
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
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
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
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
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
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
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
Multiline Stringliterale
macht den Code leserlicher und wartbarer - ersetzt externe Lösungen
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)
Sven Efftinge - itemis AG
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(\"*/\"));
}
author - company
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(\"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
Sven Efftinge - itemis AG
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.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 aussehen
var 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”);
}
}
Sven Efftinge - itemis AG
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
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
Anonymous Types
Strukturierte Sichten auf Datenbestände
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
Sven Efftinge - itemis AG
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<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<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
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 Block or expression
Parameters 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 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
Dynamic Dispatch / Multimethods
Visitors, switches, etc. adé
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
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
Polymorphismus in Java
new SpecialFoo().doStuff();
((Foo) new SpecialFoo()).doStuff();
Foo
output:
specialfoo
specialfoo
SpecialFoo
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)
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
Polymorphismus in Java (2)
doStuff(new SpecialFoo());
doStuff((Foo) new SpecialFoo());
output:
specialfoo
foo
Sven Efftinge - itemis AG
Mit Dynamic Dispatch in Java
doStuff(new SpecialFoo());
doStuff((Foo) new SpecialFoo();
output:
specialfoo
specialfoo
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)
Sven Efftinge - itemis AG
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ä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 {
In Java : Method method = myClass.getMethod(\"getName\");
return method.invoke(myObj);
} catch (Exception e) {
// handle exception
}
return null;
}
Sven Efftinge - itemis AG
Dynamisch Methoden Aufrufen
public getName(Object myObj) {
In Groovy : return myObj.getName();
}
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
Sven Efftinge - itemis AG
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 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
Sven Efftinge - itemis AG
0 comments
Post a comment