• Aucun résultat trouvé

Programmation avanc´ee et r´epartie en Java : rappels sur les mots-cl´es de Java

N/A
N/A
Protected

Academic year: 2022

Partager "Programmation avanc´ee et r´epartie en Java : rappels sur les mots-cl´es de Java"

Copied!
22
0
0

Texte intégral

(1)

rappels sur les mots-cl´ es de Java

Fr´ed´eric Gava

L.A.C.L

Laboratoire d’Algorithmique,Complexit´e etLogique

Cours de L1 EPISEN

(2)

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(3)

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(4)

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(5)

D´ eroulement du cours

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(6)

D´ eroulement du cours

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(7)

D´ eroulement du cours

1 Flot de contrˆole

2 Gestion des classes

3 Pattern-matching

(8)

Pourquoi du pattern-matching

Aussi pr´esent dans de nombreux langages (OCaml, Haskell, Rust, Scala,etc.)

Rˆoles

Conditionnelle ´etendue (switch) pour des types de donn´ees diff´erents. Con¸cu pour :

Structures de donn´ees complexes (types alg´ebriques, voir GADT) comme les arbres, etc.

Structures de donn´ees “modulables” (comportement diff´erent suivant les types ou les tailles de donn´ees)

Avec record et interface

Le fonctionnement est fortement li´e aux record etinterfacesealed (scell´ees) que nous allons aussi voir.

(9)

Rappel record (1)

Aussi pr´esent dans de nombreux langages (Ada, C, OCaml, Haskell, Rust, Scala,etc.)

Rˆoles

En g´en´eral : plusieurs donn´ees (champs donc nomm´es `a la diff´erence des nuplets) dans un mˆeme type

En Java : classes simples et purement

fonctionnelles/immutables (sans effet de bord, doncfinal!) Exemples

record Animal(String nom,intage){ ...} Donnera par le compilateur (intermediare)

public final classAnimalextends java.lang.Record{

(10)

Rappel record (2)

Constructor et m´ethodes

record Animal(String nom,intage){ publicAnimal(){

this(””, 0 );

}

publicAnimal(String name){ this.name = name;

this.age = 0;

}

// Autre codes !

// Mais equal, hashCode, toString, assesseurs inutiles ! }

Immutable !

Animal lulu =newAnimal(”Lulu”, 10);

inta = lulu.age();// OUI ! lulu.age=11;// NON ! lulu.setAge(11);// NON !

record AnimalBis(couleur Pelage)extendsAnimal;// NON !

(11)

Rappel record (3)

Autres exemples

record MinMax(intmin,int max){};

public staticMinMax(int[] data) {...}

record Point(doublex, doubley) {};

var p =newPoint(1,1);

record Carre(Point center,double size,double angle) implements FigureGeometrique{

double surface(){...}

double perimetre() {...}

...

};

(12)

Rappel record (4)

Exemple avec streams

// On augmente l’age de tout les animaux zoo = zoo.stream()

.map(bestiol−>newAnimal(bestiol.age+1,bestiol.nom) ) .collect(Collectors.toList());

// Que les noms

List<Strin>noms = zoo.stream()

.map(Animal::nom)

.collect(Collectors.toList());

// .filter(s−>...) // .sum()

(13)

Exemples simples (1)

Definition des structures interfaceShape{ }

record Rectangle(doublelength, doublewidth) implements Shape{ } record Circle(doubleradius) implementsShape{ }

Definition des structures

public static doublegetPerimeter(Shape shape)throwsIllegalArgumentException{ return switch(shape){

caseRectangle r−>2r.length() + 2r.width();

caseCircle c−>2c.radius()Math.PI;

default−>throw newIllegalArgumentException(”Unrecognized shape”);

};

}

Remarque : plus besoin deinstanceof!

(14)

Exemples simples (2)

Choix des objets et dominance

static voidtypeTester(Object obj){ switch(obj){

case null−>System.out.println(”null”);

caseInteger i−>System.out.println(”A integer”);

caseCharSequence cs−>System.out.println(”A sequence of length ” + cs.length());

caseString s−>System.out.println(”String”);

default−>System.out.println(”Something else”);

} }

Attention, le cas CharSequence domine String car chaque String est aussi une sequence (mais pas l’inverse). String est un sous-type de CharSequence. Le compilateur v´erifie les dominances

(15)

Exemple plus difficile

Diff´erencier suivant la taille

Imaginons une pile qui serait soit un tableau (si taille¡10) soit une liste.

static intsize(Stack s){ switch(s.data){

case int[] a−>returna.length();

caseList l−>returnl.length();

default−>throwError();

} }

Ainsi rajouter/supprimer un element pourrait transformer une pile d’un tableau en une liste (et vice-versa) suivant les besoins (un tableau sera plus efficace qu’une liste mais limit´e en taille ou avec un risque de cellules vides)

Default obligatoire ?

Oui...mais non, si nous avons le cas Object ou si nous avons des classes scell´ees (sealedclass).

(16)

Sealed class

Rˆoles

Restreindre `a une classe/interface quelles autres classes/interfaces pour peuvent h´eriter/impl´ementer. On d´efinit donc bien une branche dans la hi´erarchie des classes.

Int´erˆet

D´efinir une branche dans la hi´erarchie des classes. On a alors bien un ensemble restreint de classes, scell´ees entre-elles. On peut donc traˆıter sp´ecifiquement cette branche avec le switch.

(17)

Default et sealed

Plus besoin dedefaultquand on sait qu’une classe est sc´ell´ee (limit´ee) : sealedinterfaceS permits A, B, C{ }

final classAimplementsS{ } final classBimplementsS{ } record C(inti)implementsS{ }

static inttestSealedCoverage(S s){ return switch(s){

caseA a−>1;

caseB b−>2;

caseC c−>3;

};

}

s ne peut plus ˆetre autre chose que soit un A, un B ou un C. Il faut des classesfinal (ou record) pour maintenir la restriction de hi´erarchie (branche) ou non−selead (mais cela limitera le switch).

(18)

Exemples

Des figures

sealedclassShape permits Circle, Square, Rectangle{}

final classCircleimplements Shape{ ...} non−sealed classSquare extendsShape{ ...}

sealedclassRectangleextendsShape permits FilledRectangle {...}

Ici, il est possible d’´etendre `a loisir les Carr´es (danger !). Il est aussi possible d’´etendre un rectangle en un rectangle plein (mais pas autrement !).

Tout un fichier

// D´ebut fichier java

publicsealedclassFigure {}

// Toutes les autres classes seront sealed a Figure (bof)

(19)

Interface et Expressions

Definition d’une mini-calculatrice

On souhaite pouvoir ´evaluer des expressions comme 1 + (2∗3) : sealedinterfaceExpr permits ConstantExpr, PlusExpr, TimesExpr{

public int eval();

}

Evaluation

final classConstantExprimplements Expr { inti;

ConstantExpr(inti) { this.i = i;} public int eval() {returni; } }

Utilisation (cas 1 + 2)

Expr e =newPlusExpr(new ConstantExpr(1),newConstantExpr(2));

Programmation avanc´ee et r´epartie en Java 17 / 19

(20)

Pattern et condition

static voidtest(Object obj){ switch (obj){

caseString s && (s.length() == 1)−>...

caseString s −>...

default−>...

} }

(21)

Pattern, sealed et services

Enumeration

publicenum StatusEnum{SUCCESS, ERROR;}

switch(status){ caseSUCCESS−>...

caseERROR−>...

}

Sealed

sealedabstract classAbstractStatus permits ErrorStatus, SuccessStatus{ }

switch(status){

caseSuccessStatus s−>...

caseErrorStatus e−>...

}

(22)

Au travail !

Références

Documents relatifs

Le thread qui ex´ ecute wait() est mis dans un pool d’attente ; quand il en sort il “revient” dans le bloc synchronized et entre en comp´ etition avec d’autres threads pour

Cr´ eer une m´ ethode lancerThread (dans la classe principale) cr´ eant un Thread bas´ e sur le Runnable ci-dessus, et le d´ emarrant4. Dans une m´ ethode main, cr´ eer un objet de

1 M´ ethodes sp´ ecifiques aux Applets et qui leur permettent de demander au navigateur des informations ou des actions li´ ees au contexte : informations sur la page HTML

Dans le cas o` u vous utilisez un navigateur, forcez le rechargement de l’image (F5) car des param` etres de cache peuvent vous emp´ echer de voir les diff´ erences entre 2 ex´

Le fait que tout les objets d’une classe ne soient pas atteignable n’est pas suffisant pour d´ echarger une classe Chaque classloader poss` ede un cache de l’ensemble des

– ´ Ecrivez un code pour construire un Rapace qui h´ erite de Oiseau mais avec en plus la m´ ethode chasser.. Sans extends

Dans cette classe, ajouter une m´ ethode connecte, qui ` a l’aide d’une Socket se connecte au serveur correspondant ` a l’hˆ ote et au port, puis ferme la socket2. Afficher dans

Pour cela, on utilisera deux classes avec des m´ ethodes distantes, la classe Licencie et la classe Base.. D´ efinir une classe Licencie, ayant comme champs priv´ es un