40
Les Nouveautés du JAVA 7 Réalisé par Aziz GHABRY

Présentation nouveauté java7

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Présentation nouveauté java7

Les Nouveautés du JAVA 7

Réalisé par Aziz GHABRY

Page 2: Présentation nouveauté java7

PLAN

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

Page 3: Présentation nouveauté java7

Java Modularity

• Superpackages (JSR 294)• Java Module System (JSR 277)• Java Kernel (no JSR)

Page 4: Présentation nouveauté java7

Superpackages

• définit un module de développement constitué de packages.

• Indique les packages qui sont exportés.

Page 5: Présentation nouveauté java7

Superpackages (JSR 294)

src/com/foo/super-package.java:

superpackage com.foo {member package com.foo.api, com.foo.model, com.foo.util;export com.foo.api; // Make api package public

}

Page 6: Présentation nouveauté java7

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

Page 7: Présentation nouveauté java7

Module Definition Metadata

– /MODULE-INF/METADATA.module:– name=com.wombat.webservice

– extensible-metadata=[@Version(”1.0”)] – members=[com.wombat.webservice.MainApp, – com.wombat.webservice.PrivateClassA, – com.wombat.webservice.PrivateInterfaceB]– imports=[ImportModule(org.foo.xml,

@VersionConstraint(”1.3.0”)), – ImportModule(org.foo.soap,

@VersionConstraint(”2.0.0+”))]

– class-exports=[com.wombat.webservice.MainApp]

Page 8: Présentation nouveauté java7

Java Kernel

• Réorganiser JRE dans le noyau + modules optionnels, charger dynamiquement

• Concurrence avec Flex, Silverlight

Page 9: Présentation nouveauté java7

Améliorations de Swing

• Swing Application Framework (JSR 296)• Bean Binding Framework (JSR 295)• Bean Validation Framework (JSR 303)

Page 10: Présentation nouveauté java7

Swing Application FrameworkJSR 296

SingleFrameAppliction

SingleFrameAppliction

ApplicationApplication

initialize(String[] args)startup()shutdown()exit()

initialize(String[] args)startup()shutdown()exit()

ApplicationContextApplicationContext

getInstance()getInstance()

ActionManagerAction

Manager

ResourceManagerResourceManager

SessionStorageSessionStorage

TaskTask

SwingWorkerSwingWorker

ApplicationActionMapApplicationActionMap

TaskMonitor

TaskMonitor TaskServiceTaskService*

@Action@Action

LocalStorageLocal

Storage

ResourceMap

ResourceMap

ResourceConverterResourceConverter

Page 11: Présentation nouveauté java7

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.

Page 12: Présentation nouveauté java7

Bean ValidationJSR 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;

}

Page 13: Présentation nouveauté java7

Choix des Generics

class NewCollection<class E> extends Collection<E> { ... }

class NewList<class E> extends NewCollection<E>, List<E> { ... }

Page 14: Présentation nouveauté java7

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)

Page 15: Présentation nouveauté java7

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); }

Page 16: Présentation nouveauté java7

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)

Page 17: Présentation nouveauté java7

NIO 2 – File System API

FileSystemsFileSystems FileSystemFileSystem

FileReferenceFileReference

FileSystemProvider

FileSystemProvider

WatchableWatchable

WatchServiceWatchServiceCloseableCloseable

PathReferencePathReferenceBackingFileSystem

BackingFileSystem PathPath

FileSystemAttributeView

FileSystemAttributeView

FileFile

DiskSpaceAttributeView

DiskSpaceAttributeView

DirectoryDirectory

WatchKeyWatchKey

FileIdFileId

WatchEventWatchEvent

FilesFiles

Page 18: Présentation nouveauté java7

NIO 2: Copie d'un fichier

PathReference source = PathReference.from(“spongebob.jpg”);

PathReference target = PathReference.from(“squarepants.jpg”);

int flags = CopyFlag.COPY_ATTRIBUTES | CopyFlag.REPLACE_EXISTING;

source.copyTo(target, flags);

Page 19: Présentation nouveauté java7

NIO 2 – Accès permissions sur les fichiers

PathReference ref = PathReference.from("foo.txt");PosixFileAttributeView view =

ref.newFileAttributeView(PosixFileAttributeView.class); PosixFileAttributes attrs = view.readAttributes(); int perms = attrs.getPermissions();

// prints "-rw-r--r-- alice bandits" System.out.format("%s\t%s\t%s%n",

PosixFilePermission.toString(perms), attrs.getOwner(), attrs.getGroup());

// deny others perms &= ~OTHERS_READ & ~OTHERS_WRITE & ~OTHERS_EXECUTE;view.updatePermissions(perms);

// change groupUserPrincipal cops = view.lookupPrincipalByGroupName("cops");

view.updateOwners(null, cops);

Page 20: Présentation nouveauté java7

Type XML: Construction

void addReviewer(XML feature, String reviewer, String time) {

feature.add(<reviewed><who>{ reviewer }</who><when>{ time }</when>

</reviewed>);}

Page 21: Présentation nouveauté java7

Type XML: Codeur des données

package java.xml;abstract class DataCoder {

String encode(Object o);String encode(Object o, String type);<T> T decode(String data, Class<T> c);<T> T decode(String data, Class<T> c, String type);boolean supports(Class<?> c);boolean supports(Class<?> c, String type);

static final DataCoder JAVA;static final DataCoder XSD;

}

Page 22: Présentation nouveauté java7

Type XML: Exemple Datacoder

void addReviewer(XML feature, String reviewer, Timestamp time) {

DataCoder dc = DataCoder.XSD;feature.add(<reviewed>

<who>{ reviewer }</who><when>{ dc.encode(time) }</when>

</reviewed>);}

Page 23: Présentation nouveauté java7

Type XML: Navigation

void rejectOpenFeatures(XML featureList) {List<XML> fs = featureList.findAll(

“feature[state!=‘approved’]”);

for(XML f : fs) {f.get(“state”).set(“rejected”);

}}

Page 24: Présentation nouveauté java7

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;

Page 25: Présentation nouveauté java7

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(); } }}

Page 26: Présentation nouveauté java7

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(); }

}}

Page 27: Présentation nouveauté java7

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

Page 28: Présentation nouveauté java7

Closures - CICE

void validateWithMax(Stat[] stats, int max) throws InvalidStatException {validate( stats,

Validator(Stat stat) { return stat.value() <= max;

} );}

• L'interface Validator et méthode validate () sont inchangés.

Page 29: Présentation nouveauté java7

Closures - BGGA

void validateWithMax(Stat[] stats, int max) throws InvalidStatException {validate(stats, {Stat stat =>

stat.value() <= max});

}

void validate(Stat[] stats, {Stat stat => boolean} block) {for(Stat stat : stats) {

if(! block.invoke(stat)) {throw new InvalidStatException();

}}

}

Page 30: Présentation nouveauté java7

Closures - FCM

void validateWithMax(Stat[] stats, final int max) throws InvalidStatException {validate( stats,

#(boolean(Stat stat)) { return stat.value() <= max;

} );}

void validate(Stat[] stats, #(boolean(Stat)) block) {for(Stat stat : stats) {

if(! block.invoke(stat)) {throw new InvalidStatException();

}}

}

Page 31: Présentation nouveauté java7

Closures– structures de contrôle

File file = ...;FileReader reader = null;try { reader = new FileReader(file); reader.read…

} finally { if (reader != null) { try { reader.close(); } catch (IOException e) { // ignore }}

Page 32: Présentation nouveauté java7

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

Page 33: Présentation nouveauté java7

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

Page 34: Présentation nouveauté java7

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

Page 35: Présentation nouveauté java7

Units and Quantities (JSR 275)

UnitUnit

DerivedUnitDerivedUnit

ProductUnitProductUnit

SISI

BaseUnitBaseUnit

AlternateUnitAlternateUnit TransformedUnitTransformedUnit

UnitFormatterUnitFormatter

NonSINonSI

ConverterConverter

MultiplyConverterMultiplyConverter AddConverterAddConverter LogConverterLogConverter

DimensionDimension

Page 36: Présentation nouveauté java7

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]²

Page 37: Présentation nouveauté java7

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)

Page 38: Présentation nouveauté java7

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

Page 39: Présentation nouveauté java7

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érationsJACK < QUEEN

Page 40: Présentation nouveauté java7

Merci pour votre attention