Protection et portée (1)

publicité
Protection et portée (1)
Contre-exemple :
Java : notions complémentaires
(portée, protection, modificateurs, interfaces, exceptions)
Master 1ère année
Julien Velcin
http://mediamining.univ-lyon2.fr/velcin
public class Vecteur {
public double [] tab;
}
définition de la classe
Programmeur A
public static void main(…) {
Vecteur v = new Vecteur() ;
v.tab = new double[5] ;
utilisation de la classe
Programmeur B
v.tab[6] = 2.5;
}
v.tab
Mauvaise définition !
Protection et portée (2)
•  Objectifs
:
o  développement = travail d’équipe.
â risques d’erreurs et de mauvaise utilisation.
o  contrôler l’accès aux champs.
o  masquer le code interne au fonctionnement d’une classe.
•  Portée : niveaux de visibilité
Mots clefs :
private (-): classe courante.
protected (#): classe courante et héritiers.
public (+): classe courante, héritiers et instances.
à insérer avant la déclaration des champs/méthodes.
v.tab
2.5
Protection et portée (3)
•  Démarche
et mécanisme :
o  empêcher l’accès direct aux champs.
accesseurs : méthodes d’accès à un champ.
mutateurs : méthodes de modification d’un champ.
o  définir la porté des méthodes.
Exemple :
public class Vecteur {
private int price;
public void setPrice(int val) {
if (val > 0) price = val;
}
public int getPrice() {
return price;
}
}
champs “price” caché
mutateur
accesseur
Protection et portée (4)
Protection et portée (5)
Exemple :
Exemple (suite) :
public class Vecteur {
private double[] tab ;
public void initialiser(int taille) {
tab = new double[taille];
}
// accesseur
Vecteur v = new Vecteur() ;
v.initialiser(5) ;
v.setTab(6,2.5);
v.tab[6] = 2.5;
// accès contrôlé : pas d’erreur
// ne compile pas !
private boolean controleIndice(int i) {
return (i>=0 && i<tab.length);
// méthode interne
}
public void setTab(int i, double valeur) {
if (controleIndice(i))
tab[i] = valeur ;
}
// mutateur
}
Protection et portée (6)
Exercice:
Modifier le programme Location pour tenir compte de la protection.
Exemple :
private int km;
public int getKm() {
return …;
}
public void setKm(…) {
km = p_km;
}
Les modificateurs (1)
•  Définition
:
Un modificateur est un mot-clef indiquant des particularités de
classes, méthodes ou champs.
Syntaxe :
public modificateur class NomClasse {…}
public modificateur type nomFonction (int param1) {…}
public modificateur type nom_variable;
Les modificateurs (2) - static
Les modificateurs (3) - static
•  La
clause static :
application : champs et méthodes
•  La
clause static :
Rappel, calcul du prix d'un location
•  tourisme : 50 Є + 30 Є / jour + 0.50 Є / km
a) Application aux champs :
Espace mémoire unique pour toutes les instances de la classe.
Aujourd’hui, mais demain ?
⎝ Champ (variable) mais
valeur identique pour tous les petits vehicules de tourisme.
LocaTourisme
double prix_jour;
double calculPrix();
l1
prix
LocaTourisme client1 = new LocaTourisme();
LocaTourisme client2 = new LocaTourisme();
km
nb_jours
Contrainte :
client1.prix_jour = client2.prix_jour.
prix_jour
charge
Les modificateurs (4) - static
Exemple :
public class LocaTourisme {
public static double prix_jour;
...
}
l1
Les modificateurs (5) - static
l2
prix
km
nb_jours
charge
l1
l2
km
nb_jours
l1.prix_jour = 30;
30
prix_jour
km
nb_jours
prix_jour
charge
public class LocaTourisme {
public static void changePrixJour(double p_prix_jour) {
prix_jour = p_prix_jour;
}
}
public static void main(…) {
LocaTourisme.changePrixJour(45);
charge
l1
l2.prix_jour = l2.prix_jour + 15;
b) Application aux méthodes :
Méthodes invocables sans instanciation de la classe.
Exemple :
prix_jour
LocaTourisme l1 = new LocaTourisme ();
LocaTourisme l2 = new LocaTourisme ();
l2
l2
45
LocaTourisme l = new LocaTourisme();
l.changePrixJour(45);
}
Idiot !
Les modificateurs (6) - abstract
Location
- double prix
- double km
- double nb_jours
+ void saisieInfos()
+ void afficherPrix()
+ double calculPrix()
LocaTourisme
-  boolean a_velo
-  double prix_jour
+ double calculPrix()
+ void changePrixJour(double p)
jamais instanciée ⇒ abstract
Les modificateurs (7) - abstract
•  La
clause abstract :
application : classes et méthodes
a) Application aux classes :
•  objets non manipulés par le programme.
•  centralise les informations.
LocaUtilitaire
- boolean charge
+ double calculPrix()
b) Application aux méthodes :
•  détermine les méthodes obligatoires des classes filles.
•  pas de corps (quoique… à partir de Java 8 !)
Note :
•  Une classe abstraite est non instanciable.
•  Une classe redéclare les méthodes abstraites héritées.
Les modificateurs (8) - abstract
Les modificateurs (9) - final
•  La
public abstract class Location
{
public abstract double calculPrix();
}
public class LocaTourisme extends Location
{
public double calculPrix() {
prix = 30*jours + 0,5*km;
return super.calculPrix();
}
}
...
clause final :
application : classes, méthodes et champs
a) Classes :
•  Étendue
b) Méthodes :
•  Outrepassée
c) Champs :
•  Modifiable ⇒ Cste
Interfaces (1)
Interfaces (2)
Pas d’héritage multiple en Java.
è On utilise des interfaces.
•  Interface = Comportements des objets.
Ex : s’écrire dans un fichier, se dessiner à l’écran …
Comportement ⇒ méthodes
ObjectOutputStream
•  Interface = Contrat entre objets.
Ex : classe ObjectInputStream = « j accepte d écrire les objets
dans un flux SI ils signent le contrat de sérialisation.»
:
Permettre à des classes sans relations d’héritage d’utiliser des
méthodes communes.
•  Démarche
et mécanisme :
o  interface = classe abstraite.
§  méthodes: abstract & public
§  champs: public, static & final
o  implémentation / différentes classes
§  définition du corps des méthodes obligatoires
(à partir de Java 8 : existence d’implémentations par défaut)
MonObjet
Serializable
Comportement : se « sérialiser »
Interfaces (3)
•  Objectifs
j accepte d être
écrit dans un flux
j écris les objets
dans un flux
Interfaces (4)
Syntaxe :
public interface NomInterface {
NomInterface.java
type nom_variable;
⇔ public static final …
type methode_un (type nom_param);
⇔ abstract …
}
public class NomClasse implements NomInterface {
type methode_un (type nom_param) {
…
}
}
Obligatoire !
Exceptions (1)
•  Objectif : gestion des erreurs engendrées à l exécution.
Exemple :
FileInputStream R = new FileInputStream("test.txt");
Compile.
Erreur à l exécution si test.txt n existe pas.
Prévenir l erreur potentiel.
Exceptions (2)
•  Mécanisme :
Repérer les méthodes A qui jettent des exceptions, puis :
o  rediriger les exceptions dans les méthodes B qui appellent
les méthodes A,
o  OU : gérer les exceptions directement.
Exemple (1) :
FileInputStream R = new FileInputStream("test.txt");
jette (throws) : FileNotFoundException
Vector V = new Vector();
v.elementAt(-8);
jette (throws) : ArrayIndexOutOfBoundsException
Exceptions (3)
•  A la compilation:
FilmCollec.java:50: unreported exception java.io.FileNotFoundException
must be caught or declared to be thrown
FileOutputStream w = new FileOutputStream("test.dat");
•  Dans les spécifications (extrait de http://java.sun.com/j2se/1.5.0/docs/api/):
Exceptions (4)
Note :
FileInputStream renvoie deux types d exceptions.
Un seul type (FileNotFoundException) génère une erreur de compilation.
Exception
FileInputStream
public FileInputStream(File file) throws FileNotFoundException
Creates a FileInputStream by opening a connection to an actual file, the file named by the File
object file in the file system. A new FileDescriptor object is created to represent this file connection…
Parameters:
file - the file to be opened for reading.
Throws:
FileNotFoundException - if the file does not exist, is a directory rather than a regular file,
or for some other reason cannot be opened for reading.
SecurityException - if a security manager exists and its checkRead method denies read
access to the file.
RuntimeException
SecurityException
Les exceptions dérivées de RuntimeException
ne génèrent pas d erreurs à la compilation
FileNotFoundException
Exceptions (5)
Exceptions (6)
Syntaxe (b) :
Syntaxe (a) :
try {
public TypeRetour nomMethod() throws TypeException, …
Exemple (2a) :
Dans la classe Bar:
// instructions sensibles
} catch (TypeException nom_exception) {
// Si une exception de type TypeException est renvoyée,
} finally {
// Dans tous les cas.
}
Exemple (2b) : dans la classe MainFilm
public void enregistrer()
throws IOException {
FileOutputStream w = new FileOutputStream("test.dat");
ObjectOutputStream o = new ObjectOutputStream(w);
o.writeObject(maListe);
o.close();
W.close();
}
Bar b = new Bar();
try {
b.enregistrer();
} catch (IOException io) {
System.out.println("Impossible d écrire la collection");
} finally {
System.out.println("Dans tous les cas");
}
Exceptions (7)
Bar b = new Bar();
try {
b.enregistrer();
} catch (Exception e) {
System.out.println("Il y a un problème");
}
Exceptions (8)
•  Créer sa propre exception
public class MonException extends Exception
{
public MonException(String t, etc.)
{
super(t);
// et d autres initialisations si besoin
}
(...)
}
Exceptions (9)
Exceptions (8)
•  Lancer une exception
IOException
IOException
Syntaxe :
throw new UneExceptionDeVotreChoix(paramètres);
Exemple :
public class MaClasse
{
public void maFonction(...) throws UneException
{
throw new UneException("Texte décrivant l erreur");
}
ObjectOutputStream
Bar
writeObject()
jette IOException
enregistrer()
jette IOException
main(…)
attrape IOException
…et la traite
(...)
}
Commentaires et Javadoc
Plan du cours
• Sur une ligne :
// Comme en C++ , après un slash-slash
int i; // commentaire jusqu à la fin de la ligne
• Sur plusieurs lignes :
/* Comme en C , entre un slash-étoile et
un étoile-slash, sur plusieurs lignes */
• Pour la Javadoc :
/**
* pour l utilisation de Javadoc
* à réserver pour la documentation automatique
* avec javadoc
*/
â commenter
le plus possible et judicieusement chaque déclaration (variable, mais
aussi méthode, classe).
â commenter clairement (utiliser au mieux les 3 possibilités)
• 
• 
• 
• 
• 
• 
Introduction au langage Java
Programmation Orientée Objet
Notions complémentaires
Quelques API standards
Interface graphique en Java FX
API pour la recherche d’information
Téléchargement