Clairement dans cette version, nous assistons à une volonté de simplification. Plus de lisibilité du code, plus d’outils pour ne plus avoir à perdre de temps sur des opérations simples et courantes, pour au final un code de meilleur qualité et plus accessible. La plupart de ces améliorations se trouvent dans cette présentation.
2. Modularité du Java
Swing
Types et génériques
NIO 2
Support natif XML
Support des propriétés JavaBean
Closures - abstraction
API Date & Time
Units & Quantities
JMX 2.0
Javadoc
6. Java Module System (JSR 277)
Format de distribution de déploiement du module
Versioning et dépendance
Dépôt API
L’appui d'exécution dans le lanceur / classloaders
11. Bean Binding Framework
JSR 295
• Utilisez une Binding pour lier les propriétés de deux beans:
Binding binding = new Binding(source, "sourcePath",
target, "targetPath");
binding.bind();
• Une fois lié, les changements de chaque source ou cible sont envoyés
vers l'autre.
• Changements passer par un BindingConverter et un BindingValidator le long
du chemin.
• Le langage d'expression JSP (EL) est utilisé pour spécifier les conversions.
12. Bean Validation
JSR 303
• Voici un exemple de Hibnerate Validator qui peut être évocateur:
public class Address {
@NotNull
private String line1;
private String line2;
private String zip;
private String state;
@Length(max = 20)
@NotNull
private String country;
@Range(min = -2, max = 50, message = "Floor out of range")
public int floor;
}
13. Choix des Generics
class NewCollection<class E> extends
Collection<E> { ... }
class NewList<class E> extends
NewCollection<E>, List<E> { ... }
14. Annotations sur types JSR 308
• pour les arguments de type générique à des classes paramétrées:
Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
• pour les arguments de type générique à une méthode générique ou d'invocation du
constructeur:
o.<@NonNull String>m("...");
• Pour paramètres de type bounds et wildcards:
class Folder<F extends @Existing File> { ... }
Collection<? super @Existing File>
• pour l'héritage de classe :
class UnmodifiableList<T> implements @Readonly List<@Readonly T> { ...
}
• Pour les clauses throws :
void monitorTemperature() throws @Critical TemperatureException { ... }
• Pour les conversions de type :
myString = (@NonNull String) myObject;
• Pour les types du test:
boolean isNonNull = myString instanceof @NonNull String;
• Pour la création des objets:
new @NonEmpty @Readonly List<String>(myNonEmptyStringSet)
15. Création d'une instance raccourcie
public static void main(String[] args) {
map := new HashMap<String, Integer>();
for(word : args) {
freq := map.get(word);
map.put(word, (freq==null) ? 1 : freq+1);
}
System.out.println(map); }
public static void main(String[] args) {
final map = new HashMap<String, Integer>();
for(final word : args) {
final freq = map.get(word);
map.put(word, (freq==null) ? 1 : freq+1);
}
System.out.println(map); }
16. NIO 2 (JSR 203)
• Les principales caractéristiques :
– Nouvelle interface filesystem
• Permissions
• Les attributs de fichiers
• Implémentations débrochables
• Échapper vers les spécifications de l’API filesystem
– API pour E/S asynchrones sur les sockets et les fichiers
– La réalisation de canaux socket (multicast, options, etc)
17. NIO 2 – File System API
Closeable WatchService WatchEvent
WatchKey
Watchable
Files
FileId
FileSystems FileSystem
FileReference Directory
FileSystem
Provider
BackingFile
PathReference Path
System
FileSystem
AttributeView
File
DiskSpace
AttributeView
24. Support des propriétés JavaBean
Proposition de nouveau mot-clé :
public class Point {
property double x;
property double y;
}
Point p = new Point(1, 2);
System.out.println(p.x + " " + p.y);
Nouvelle proposition de la syntaxe d'accesseur:
Point p = new Point();
p->X = 56;
p->Y = 87;
int z = p->X;
25. Closures - abstraction
Closures :
Commencer à penser à eux comme des blocs de code, vous pouvez passer autour et invoquer plus tard.
Peut déjà le faire en Java avec les classes internes ou des objets de la méthode
void validateWithMax(Stat[] stats, final int max) throws InvalidStatException {
for(Stat stat : stats) {
if(! (stat.value() <= max)) {
throw new InvalidStatException();
}
}
}
void validateWithMin(Stat[] stats, final int min) throws InvalidStatException {
for(Stat stat : stats) {
if(! (stat.value() >= min)) {
throw new InvalidStatException();
}
}
}
26. Closures– Inner Classes
void validateWithMax(Stat[] stats, final int max) throws InvalidStatException {
validate( stats, new Validator() {
public boolean isValid(Stat stat) { return stat.value() <= max; }
} ); }
void validateWithMin(Stat[] stats, final int min) throws InvalidStatException {
validate( stats, new Validator() {
public boolean isValid(Stat stat) { return stat.value() >= min; }
} ); }
interface Validator { boolean isValid(Stat stat); }
void validate(Stat[] stats, Validator validator) {
for(Stat stat : stats) {
if(! validator.isValid(stat)) { throw new InvalidStatException(); }
}
}
27. Les propositions des Closures
• BGGA – Gilad Bracha, Neal Gafter, James Gosling,
Peter von der Ahe
• CICE – “Concise Instance Creation Expressions”
– Josh Bloch, Bob Lee, Doug Lea
• FCM – “First Class Methods” / JCA “Java Control
Abstraction”
– Stephen Colebourne, Stefan Schulz, Ricky Clarkson
32. Closures - JCA
File file = ...;
usingFileReader(FileReader reader : file) {
reader.read…
}
public static void usingFileReader(#(void(FileReader)) block : File file) throws IOException {
FileReader reader = null;
try {
reader = new FileReader(file);
block.invoke(reader);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) { }
}
}
- c'est la définition de type de bloc, variables passées dans le bloc
- Passer des variables nécessaires par le bloc dans la méthode invoke
33. Closures - BGGA
File file = ...;
usingFileReader(FileReader reader : file) {
reader.read…
}
public static <T,throws E extends Exception>
T usingFileReader(File file, {=>T throws E} block) throws E {
FileReader reader = null;
try {
reader = new FileReader(file);
return block.invoke(reader);
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) { }
}
}
• La syntaxe BGGA est beaucoup plus compliquée car elle est la manipulation à la fois la syntaxe et la
syntaxe avant l'abstraction de contrôle.
• Avoir à gérer cas d'exception, mais fondamentalement semblable dans son concept
34. API Date / Time
• Correction des APIs existantes date/heure
• Problèmes heure d'été
• Threads DateTimeFormat
• Mutabilité Date/Calendar
• Manque des classes interval/duration
• Basé sur JodaTime
• Analyse, de mise en forme, l'arithmétique, etc
35. Units and Quantities (JSR 275)
Unit UnitFormatter SI
NonSI
BaseUnit DerivedUnit Dimension
ProductUnit AlternateUnit TransformedUnit Converter
MultiplyConverter AddConverter LogConverter
36. Exemples des Unités
// Conversion entre les unités.
KILO(METER).getConverterTo(MILE).convert(10)
• 6.2137119223733395
// Récupération de l'unité système (identifie le type de mesure).
REVOLUTION.divide(MINUTE).getSystemUnit()
• rad/s
// Vérifier la dimension
ELECTRON_VOLT.isCompatible(WATT.times(HOUR))
• true
// Récupération de dimension unitaire (dépend du modèle actuel).
ELECTRON_VOLT.getDimension()
• [L]²·[M]/[T]²
37. JMX (Java Management Extensions)
• JMX 2.0 (JSR 255)
– Rénovation avec les types génériques
– Utilisation les annotations
– Faire MBeans ouverts facile à utiliser
– Généraliser les moniteurs pour supporter types
complexes
– serveurs Mbean Cascade/fédéré
– Les connecteurs services Web (JSR 262)
38. Javadoc (JSR 260)
• De nouvelles étiquettes pour des exemples,
• Catégorisations nouveaux types de
méthodes, propriétés de bean, etc
• Mettre à jour le look old school
39. Autres..
• Support des opérateurs numérique pour le type
BigDecimal
BigDecimal a = …
BigDecimal b = …
BigDecimal s = a + b;
• Comparaisons de chaines de caractères dans la
clause switch:
switch(stooge) {
case ‘Moe’: …
• Comparaison pour les énumérations
JACK < QUEEN