Programmation avancée et répartie en Java

publicité
Programmation avancée et répartie en Java :
rappels sur les mots-clés de Java
Frédéric Gava
L.A.C.L
Laboratoire d’Algorithmique, Complexité et Logique
Cours de M1 MIAGE
Plan
1
Flot de contrôle
2
Gestion des classes
Plan
1
Flot de contrôle
2
Gestion des classes
Flot de contrôle
Gestion des classes
Déroulement du cours
1
Flot de contrôle
2
Gestion des classes
Programmation avancée et répartie en Java
3 / 22
Flot de contrôle
Gestion des classes
Assert
Rôle
Permet de s’assurer d’une propriété avant de continuer l’exécution.
assert condition [: objet] ;
Un AssertionError est lancé si la condition n’est pas vérifiée. Les
assertions sont ignoré par défaut (il faut utiliser l’option -ea ou
-enableassertions pour les activer). Dans la condition, ne pas
mettre un calcul qui modifie vos données !
Exemple
private double divise(int a, int b) {
assert b != 0 : ”Impossible de diviser par zéro”;
...
On vérifie souvent les paramètres d’une méthode avec des assert
pour être sûr qu’ils sont tels qu’on les pense.
Programmation avancée et répartie en Java
4 / 22
Flot de contrôle
Gestion des classes
Break et Continue (1)
Rôle
break : une instruction permettant de sortir d’une instruction
de contrôle, d’un opérateur d’itération ou d’un bloc try.
continue : permet de sauter une itération d’une boucle. C’est
à dire qu’on passe directement à l’itération suivante sans
effectuer le reste des opérations.
Exemple (1)
for(int i = 0; i < 1555; i++){
if(condition) break; //On sort de la boucle
...
}
Programmation avancée et répartie en Java
5 / 22
Flot de contrôle
Gestion des classes
Break et Continue (2)
Exemple (2)
Boucle1: while(true){
System.out.println(”Boucle 1”);
Boucle2: for(int ind=0; ind < 10; ind++) {
System.out.println(”Boucle 2”);
Boucle3: while(true){
System.out.println(”Boucle 3”);
break Boucle2;
}
}
break;
}
Exemple (3)
while(true) {
...
if(condition1) break; // quitte la boucle
if (condition2) continue; // retourne au début de la boucle
... }
Programmation avancée et répartie en Java
6 / 22
Flot de contrôle
Gestion des classes
Switch, case et default
Rôle
Eviter trop de if else dans le cas où il y a plusieurs cas possibles.
Le code de default est exécuté si aucun case n’est possible.
Utilisation de break pour couper le switch, sinon celui-ci teste
aussi les autres case (au cas où).
Exemple
switch(id) {
case 1 : System.out.println(”Je suis premier”); break;
case 2 : System.out.println(”Je suis deuxième”); break;
case 3 : System.out.println(”Je suis troisième”); break;
default : System.out.println(”Je ne sais pas où je suis”);
}
Fonctionne aussi avec les String depuis Java 7.
Programmation avancée et répartie en Java
7 / 22
Flot de contrôle
Gestion des classes
Finally
Rôle
Clause suivie d’un bloc d’instructions. Cette clause suit elle-même
un bloc try, ou un bloc try catch. Quelque soit la manière dont on
sort du try, les instructions contenues dans le finally sont toujours
exécutées.
Exemple
try {
... //Instructions quelconques
}
finally {
... //Opérations effectuées après les instructions du try
}
Programmation avancée et répartie en Java
8 / 22
Flot de contrôle
Gestion des classes
Throw et Throws
Rôle
throw est pour lancer une exception. throws est pour indiquer que
la méthode peut faire remonter une exception.
Exemple
if(erreur) throw new Exception(”Une erreur est arrivée”);
public void read throws IOException {
//Code pouvant lancer une IOException
}
Rappel : Exception et IOException doivent obligatoirement
descendre de Throwable.
Programmation avancée et répartie en Java
9 / 22
Flot de contrôle
Gestion des classes
Utilisation de this dans une classe interne
Rôle
Dans le cas d’une classe interne (non static), le mot clé this
permet de récupérer l’instance de la classe englobante.
Exemple
public class Englobante {
private Object attribut;
public final class Interne {
private Object attribut;
private switch() {
Englobante.this.attribut = this.attribut;
}
...
Englobante.this fait donc référence à l’instance de la classe
englobante et this fait référence à la classe interne.
Programmation avancée et répartie en Java
10 / 22
Flot de contrôle
Gestion des classes
Synchronised
Plus de détails la semaine prochaine !
Rôle
Utilisé dans la programmation multithread dans la déclaration
d’une méthode ou d’un bloc d’instructions pour indiquer que seul
un thread peut accéder en même temps à ce bloc ou à cette
méthode
4 manières d’utilisation
(1) public void synchronized methode(){
print(”2 threads ne peuvent pas appeler cette méthode ‘en même temps’”);
...
(2) public void methode(){
synchronized(this){
print(”2 threads ne peuvent pas exécuter ce code ‘en même temps’”);
...
(3) synchronized(monObjet) {... // code}
(4) public static void methode() {synchronized(MaClass.class) {... // code} ... }
Programmation avancée et répartie en Java
11 / 22
Flot de contrôle
Gestion des classes
Volatile
Plus de détails prochainement !
Rôle
Utilisation sur des variables modifiables de manière asynchrone
(plusieurs threads y ont accès “simultanément”). Le fait
d’employer volatile oblige la JVM à rafraı̂chir son contenu à
chaque utilisation. Ainsi, on est sûr qu’on n’accède pas à la valeur
mise en cache mais bien à la valeur correcte.
Déclaration
public volatile Integer = 5;
Programmation avancée et répartie en Java
12 / 22
Flot de contrôle
Gestion des classes
Déroulement du cours
1
Flot de contrôle
2
Gestion des classes
Programmation avancée et répartie en Java
13 / 22
Flot de contrôle
Gestion des classes
Import static
Rôle
Importer que les codes statiques.
Utilisation
import com.test.Tester;
import static java.lang.∗;
Permet d’importer dans notre code, une classe stactic ou une
variable static d’une classe, ceci à des fins d’allégement de code.
Programmation avancée et répartie en Java
14 / 22
Flot de contrôle
Gestion des classes
Native
Plus de détails prochainement !
Rôle
Ce mot-clé est utilisé dans la déclaration d’une méthode pour
indiquer que cette méthode n’est pas codée en Java, mais dans un
langage natif dans un fichier à part (du C généralement). Une telle
méthode n’a donc pas de corps puisque le code ne se trouve pas
dans la classe Java.
Déclaration
public native void ouvrirLecteurCD();
Beaucoup utilisé dans les bibliothèques standards pour effectuer
des appels systèmes en code C (IO, matériel, etc.)
Programmation avancée et répartie en Java
15 / 22
Flot de contrôle
Gestion des classes
Strictfp
Rôle
Utilisable sur la déclaration de classes, d’interfaces ou de
méthodes. Il oblige la JVM à effectuer les calculs selon les
spécifications du langage : garantie un même résulat quelle que
soit la machine virtuelle utilisée. Java effectue les calculs en
garantissant une priorité de la gauche vers la droite. Mais pas
forcement les implémentations des JVM...
Exemple
public strictfp class FPDemo {
public static void main(String[] args) {
double d = 8e+307;
System.out.println(4 ∗ d / 2); ===> si droite gauche alors, (d/2)∗4
System.out.println(2 ∗ d);
(4∗d) produit un dépassement de capacité, donc un résultat infini.
En revanche, 2∗d produit bien un résultat correct.
Programmation avancée et répartie en Java
16 / 22
Flot de contrôle
Gestion des classes
Transient
Rôle
Permet de ne pas sauvegarder une variable lors de la sérialisation
de la classe. Ainsi la variable ne va pas apparaı̂tre dans le fichier.
Applications alors qu’une donnée sensible ne doit en aucun cas
apparaı̂tre dans un fichier (p. ex. un mot de passe). Cela permet
aussi de “remettre à zéro” certaines valeurs (p. ex., dans un jeu, ne
pas sauvegarder le temps de jeu depuis le début de la partie).
Utilisation
class Writeable implements java.io.Serializable {
...
public transient int var1 = 2;
Si nous sérialisons une instance de cette classe, “var1” ne sera pas sauvegardée. Lors
de la désérialisation, elle prendra la valeur 0 malgré la présence de la valeur par défaut
2. L’attribution d’une valeur par défaut se fait lors de l’instanciation de l’objet.
Programmation avancée et répartie en Java
17 / 22
Flot de contrôle
Gestion des classes
Final, Rappel des rôles (1)
Devant une méthode
Celle-ci ne pourra plus être redéfinie dans une classe fille. Ce qui
entraı̂ne une certaine optimisation dans les appels à cette méthode.
Devant une classe
On ne peut pas créer de classe dérivée de celle-ci. Par exemple il
est impossible de dériver une classe à partir de la classe String de
la bibliothèque de base. La solution consisterait à “encapsuler”
String dans une classe de notre conception.
Devant un paramètre d’une méthode
Empêche l’attribution d’une nouvelle valeur au paramètre :
public void methode(final List<Object> liste, final int entier){
entrier = 0; // interdit
liste = new ArrayList<Object>(); // interdit
Programmation avancée et répartie en Java
18 / 22
Flot de contrôle
Gestion des classes
Final, Rappel des rôles (2)
Devant une variable membre ou une variable locale
La variable ne peut plus être modifiée après son initialisation et
doit obligatoirement être initialisée une fois (et une seule fois). Si
la classe possède plusieurs constructeurs, la variable doit être
correctement initialisée quel que soit le constructeur utilisé (sinon
le compilateur provoquera une erreur). Pour une variable membre
static, elle doit être initialisée telle quelle :
private static final int x = 5;
Immutable ≡ final
Un objet est immutable s’il n’est jamais modifiée après sa
construction. Un objet immutable est toujours thread-safe.
Cohérence du mot-clés : nous verrons plus tard qu’un objet spécial
est toujours associé à une définition de classe. Donc, à une classe
final (héritage interdit) est associée un objet immutable.
Programmation avancée et répartie en Java
19 / 22
Flot de contrôle
Gestion des classes
Enum, énumérations (1)
Rôle
Permettre d’avoir différentes valeurs pour des variables sans utiliser
une simulation avec des String ou des int.
Exemple
public enum Langage {JAVA, C, CPlus, PHP; }
les énumérations héritent de la classe java.lang.Enum.
Utilisation
for(Langage lang : Langage.values()){
if(Langage.JAVA.equals(lang))
System.out.println(”J’aime le : ” + lang); // ===> Affiche JAVA
...
Programmation avancée et répartie en Java
20 / 22
Flot de contrôle
Gestion des classes
Enum, énumérations (2)
Constructeur
public enum Langage {
//Objets directement construits
JAVA (”Langage JAVA”),
C (”Langage C”),
CPlus (”Langage C++”),
PHP (”Langage PHP”);
private String name = ””;
//Constructeur
Langage(String name){this.name = name;}
public String toString(){return name;}
...
Remarque : pas de déclaration de portée, pour une raison simple ; il est toujours
considéré comme private afin de préserver les valeurs définies dans l’enum.
Programmation avancée et répartie en Java
21 / 22
Au travail !
Téléchargement