SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
JAVA EFFICACE

Monday, November 5, 12
agenda
création et destruction d’objet
méthodes communes
classes et interfaces
méthodes
exceptions
threads
...

Monday, November 5, 12
création et destruction d’objet

Monday, November 5, 12
création et destruction d’objet

Privilégier des méthodes de fabrique statiques aux constructeurs :
public static Boolean valueOf(boolean b) {
return (b? Boolean.TRUE : Boolean.FALSE);
}
■
■
■
■

Posséde un nom
Pas d’obligation de créer un nouvel objet à chaque fois
Permet d’envoyer des objets de tout type
Utiliser valueOf ou getInstance

Monday, November 5, 12
création et destruction d’objet

Eviter les finaliseurs
void finalize() {
try {
// finalise l’état
finally {
super.finalize();
}
}

■ Utiliser plutôt une méthode public explicite de fermeture des ressources

Monday, November 5, 12
méthodes communes

Monday, November 5, 12
méthodes communes
Obéir au contrat général lors d’une redéfinition de la méthode equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Object other = obj;
if (attribut == null) {
if (other. attribut != null)
return false;
} else if (!attribut.equals(other.attribut))
return false;
return true;
}

■ Quand définir equals ?
■ L’égalité logique différe de l’égalité d’objet
■ Si non redéfinit par une classe parente

Monday, November 5, 12
méthodes communes
Toujours redéfinir hashCode lorsque equals est redéfini

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attr == null) ? 0 : attr.hashCode());
return result;
}

■ Des objets égaux doivent avoir des codes de hashage égaux

Monday, November 5, 12
méthodes communes
Toujours redéfinir toString

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Objet [attr=").append(attr).append("]");
return builder.toString();
}

■ Rend l’utilisation plus aggréable
■ Doit renvoyer toutes les informations interressantes contenues dans l’objet

Monday, November 5, 12
méthodes communes
Envisager l’implémentation de Comparable

@Override
public int compareTo(Objet o) {
ChaineInsensibleCasse cic = (ChaineInsensibleCasse)o;
return String.CASE_INSENSITIVE_ORDER.compare(this.s,cis.s);
}

■ Utilisé par Collections.sort()

Monday, November 5, 12
classes et interfaces

Monday, November 5, 12
classes et interfaces
Restreindre l’accès des classes et de leurs membres
public class MyCoolObject {
private char[] attr0;
int attr1;
protected String attr2;
public String attr3;
...
}

■ Rendre chaque classe ou membre aussi innaccessible que
possible (régle de base)
■ privé, privée paquetage, protégé, public
■ Ne jamais avoir un tableau public et static

Monday, November 5, 12
classes et interfaces
Favoriser l’immutabilité
■ Une classe immuable est tout simplement une classe dont les instances
ne peuvent pas être modifiées. Elle est figée lors de la création. (ex:
String, BigInteger, BigDecimal, ...)
■ Exelente brique de base pour d’autres objets
■ Comment faire ?
■ Ne pas fournir de méthode susceptible de modifier l’objet
■ S’assurer qu’aucune méthode ne peut être redéfinie
■ Rendre finaux tout les champs
■ Rendre privée tout les attributs
■ Garantir l’accés exclusif à tout composant muable

Monday, November 5, 12
classes et interfaces

■
■
■
■

Préférer la composition à l’héritage
Prévoir et documenter l’héritage ou bien l’interdire
Préférer les interfaces aux classes abstraites
N’utiliser les interfaces que pour définir les types

Monday, November 5, 12
méthodes

Monday, November 5, 12
méthodes
Vérifier la validité d’un paramètre
public boolean displayErrors(Set<ConstraintViolation<T>> violations, HasHTML hasHTML){
if (violations == null)
throw new NullPointerException("violations must not be null");
if (hasHTML == null)
throw new NullPointerException("hasHTML must not be null");
if (hasHTML.getHTML().isEmpty())
throw new IllegalArgumentException("hasHTML.html must not be empty");
...
}

■ A faire au début d’une méthode
■ NPE, IAE, ISE, IOOBE, UOE, ...

Monday, November 5, 12
méthodes
Renvoyer des tableaux et/ou lists vide plutôt que null
public List<String> getMessages(){
final List<String> msgs = new ArrayList<String>();
... // some code (add, ...)
return msgs;
}

■ Plus besoin de traiter le cas “null”

Monday, November 5, 12
méthodes

■ Concevoir avec attention la signature d’une méthode
■ Ecrire des commentaires de documentation pour tous les
éléments exposés d’une API

Monday, November 5, 12
exceptions

Monday, November 5, 12
exceptions
Préférer l’utilisation d’une exception standard
public void method(int i) throws Exception{
if(i<0) throw new IllegalArgumentException(“message”);
try {
// ...
} catch (IOException) {
// situation récupérable
}
}

■ Runtime exception : NPE, ...
■ Exception vérifié : IOE, ...
■ Utiliser une exception vérifiée pour une situation récupérable et une exception non
vérifié pour une erreur de programmation
■ Ne pas ignorer une exception

Monday, November 5, 12
thread

Monday, November 5, 12
threads

■
■
■
■

Monday, November 5, 12

Synchroniser l’accès à toute donnée partagée et muable
Eviter toute synchronisation excessive
Ne jamais invoquer wait en dehors d’une boucle
Eviter les groupes de threads
programmation générale (conclusion)

■
■
■
■
■
■
■
■

Monday, November 5, 12

Minimiser la portée des variables locales
Connaître et utiliser les bibliothèques
Eviter float et double si un résultat exact est requis
Eviter les chaînes de caractères là où d’autres types sont
plus appropriés
Attention à la performance dans la concaténation de chaînes
de caractères
Faire référence à un objet via son interface
Préférer les interfaces à la réflection
Suivre les conventions de nommage généralement acceptées
Monday, November 5, 12

Contenu connexe

En vedette

Anticipation et gestion du risque numérique : Proposition d’un guide de trava...
Anticipation et gestion du risque numérique : Proposition d’un guide de trava...Anticipation et gestion du risque numérique : Proposition d’un guide de trava...
Anticipation et gestion du risque numérique : Proposition d’un guide de trava...Andres Coronado
 
Crise écologique
 Crise écologique Crise écologique
Crise écologiqueRcoutouly
 
Boletín ordinario nro 10
Boletín ordinario nro 10Boletín ordinario nro 10
Boletín ordinario nro 10Yasmin Cortes
 
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...Ministère de l'Économie et des Finances
 
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...Espacio Público
 
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter Umberg
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter UmbergFondation Fernet-Branca saint-Louis Bernard Frize – Günter Umberg
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter UmbergBâle Région Mag
 
Présentation carriere
Présentation carrierePrésentation carriere
Présentation carrierejoseerichard11
 
Développement dans le cloud - Sacha Labourey
Développement dans le cloud - Sacha LaboureyDéveloppement dans le cloud - Sacha Labourey
Développement dans le cloud - Sacha Laboureylyonjug
 
Acciones y herramientas VT+IC 1
Acciones y herramientas VT+IC 1Acciones y herramientas VT+IC 1
Acciones y herramientas VT+IC 1Alfredo Castañeda
 
Programme Interférences n°1
Programme Interférences n°1Programme Interférences n°1
Programme Interférences n°1AdGENCY Experts
 
Questionnaire Results
Questionnaire ResultsQuestionnaire Results
Questionnaire Resultspriasandhu
 
Meningiome a cellules claires, 2011 vienne.
Meningiome a cellules claires, 2011 vienne.Meningiome a cellules claires, 2011 vienne.
Meningiome a cellules claires, 2011 vienne.Norbert Manzo
 
First Partial Review v.2
First Partial Review v.2First Partial Review v.2
First Partial Review v.2Carlos Vázquez
 

En vedette (20)

Anticipation et gestion du risque numérique : Proposition d’un guide de trava...
Anticipation et gestion du risque numérique : Proposition d’un guide de trava...Anticipation et gestion du risque numérique : Proposition d’un guide de trava...
Anticipation et gestion du risque numérique : Proposition d’un guide de trava...
 
Crise écologique
 Crise écologique Crise écologique
Crise écologique
 
Boletín ordinario nro 10
Boletín ordinario nro 10Boletín ordinario nro 10
Boletín ordinario nro 10
 
Victor molev
Victor molevVictor molev
Victor molev
 
Les marchés du travail dans la crise economie et statistique 438–440
Les marchés du travail dans la crise economie et statistique 438–440Les marchés du travail dans la crise economie et statistique 438–440
Les marchés du travail dans la crise economie et statistique 438–440
 
2014 b2 en finale
  2014 b2 en finale  2014 b2 en finale
2014 b2 en finale
 
Guide formalites douanes juillet 2011
Guide formalites douanes juillet 2011Guide formalites douanes juillet 2011
Guide formalites douanes juillet 2011
 
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...
noteobservations-25-10-2011de la CNIL sur le PL relative à la protection de l...
 
Bulletin bd f synthese colloque international microfinance_etude 185-4
Bulletin bd f synthese colloque international microfinance_etude 185-4Bulletin bd f synthese colloque international microfinance_etude 185-4
Bulletin bd f synthese colloque international microfinance_etude 185-4
 
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...
Sobre Criminalización de Defensores DDHH en Venezuela Capítulo de Rafael Uzcá...
 
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter Umberg
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter UmbergFondation Fernet-Branca saint-Louis Bernard Frize – Günter Umberg
Fondation Fernet-Branca saint-Louis Bernard Frize – Günter Umberg
 
Présentation carriere
Présentation carrierePrésentation carriere
Présentation carriere
 
Développement dans le cloud - Sacha Labourey
Développement dans le cloud - Sacha LaboureyDéveloppement dans le cloud - Sacha Labourey
Développement dans le cloud - Sacha Labourey
 
Acciones y herramientas VT+IC 1
Acciones y herramientas VT+IC 1Acciones y herramientas VT+IC 1
Acciones y herramientas VT+IC 1
 
Chapeus
ChapeusChapeus
Chapeus
 
Programme Interférences n°1
Programme Interférences n°1Programme Interférences n°1
Programme Interférences n°1
 
ALSBLNB Conférence 2014 Saint John Atelier C- Propager le mot sur le logemen...
ALSBLNB Conférence 2014 Saint John Atelier C-  Propager le mot sur le logemen...ALSBLNB Conférence 2014 Saint John Atelier C-  Propager le mot sur le logemen...
ALSBLNB Conférence 2014 Saint John Atelier C- Propager le mot sur le logemen...
 
Questionnaire Results
Questionnaire ResultsQuestionnaire Results
Questionnaire Results
 
Meningiome a cellules claires, 2011 vienne.
Meningiome a cellules claires, 2011 vienne.Meningiome a cellules claires, 2011 vienne.
Meningiome a cellules claires, 2011 vienne.
 
First Partial Review v.2
First Partial Review v.2First Partial Review v.2
First Partial Review v.2
 

Plus de Xavier Carpentier

Plus de Xavier Carpentier (6)

#Restful really ? ElsassJUG 17 juin 2014
#Restful really ? ElsassJUG 17 juin 2014#Restful really ? ElsassJUG 17 juin 2014
#Restful really ? ElsassJUG 17 juin 2014
 
Restful, really ? MixIt 2014
Restful, really ? MixIt 2014Restful, really ? MixIt 2014
Restful, really ? MixIt 2014
 
Hibernate
HibernateHibernate
Hibernate
 
Maven
MavenMaven
Maven
 
Injection de dependance en Java
Injection de dependance en JavaInjection de dependance en Java
Injection de dependance en Java
 
Egoless
EgolessEgoless
Egoless
 

Java Efficace

  • 2. agenda création et destruction d’objet méthodes communes classes et interfaces méthodes exceptions threads ... Monday, November 5, 12
  • 3. création et destruction d’objet Monday, November 5, 12
  • 4. création et destruction d’objet Privilégier des méthodes de fabrique statiques aux constructeurs : public static Boolean valueOf(boolean b) { return (b? Boolean.TRUE : Boolean.FALSE); } ■ ■ ■ ■ Posséde un nom Pas d’obligation de créer un nouvel objet à chaque fois Permet d’envoyer des objets de tout type Utiliser valueOf ou getInstance Monday, November 5, 12
  • 5. création et destruction d’objet Eviter les finaliseurs void finalize() { try { // finalise l’état finally { super.finalize(); } } ■ Utiliser plutôt une méthode public explicite de fermeture des ressources Monday, November 5, 12
  • 7. méthodes communes Obéir au contrat général lors d’une redéfinition de la méthode equals @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Object other = obj; if (attribut == null) { if (other. attribut != null) return false; } else if (!attribut.equals(other.attribut)) return false; return true; } ■ Quand définir equals ? ■ L’égalité logique différe de l’égalité d’objet ■ Si non redéfinit par une classe parente Monday, November 5, 12
  • 8. méthodes communes Toujours redéfinir hashCode lorsque equals est redéfini @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((attr == null) ? 0 : attr.hashCode()); return result; } ■ Des objets égaux doivent avoir des codes de hashage égaux Monday, November 5, 12
  • 9. méthodes communes Toujours redéfinir toString @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("Objet [attr=").append(attr).append("]"); return builder.toString(); } ■ Rend l’utilisation plus aggréable ■ Doit renvoyer toutes les informations interressantes contenues dans l’objet Monday, November 5, 12
  • 10. méthodes communes Envisager l’implémentation de Comparable @Override public int compareTo(Objet o) { ChaineInsensibleCasse cic = (ChaineInsensibleCasse)o; return String.CASE_INSENSITIVE_ORDER.compare(this.s,cis.s); } ■ Utilisé par Collections.sort() Monday, November 5, 12
  • 12. classes et interfaces Restreindre l’accès des classes et de leurs membres public class MyCoolObject { private char[] attr0; int attr1; protected String attr2; public String attr3; ... } ■ Rendre chaque classe ou membre aussi innaccessible que possible (régle de base) ■ privé, privée paquetage, protégé, public ■ Ne jamais avoir un tableau public et static Monday, November 5, 12
  • 13. classes et interfaces Favoriser l’immutabilité ■ Une classe immuable est tout simplement une classe dont les instances ne peuvent pas être modifiées. Elle est figée lors de la création. (ex: String, BigInteger, BigDecimal, ...) ■ Exelente brique de base pour d’autres objets ■ Comment faire ? ■ Ne pas fournir de méthode susceptible de modifier l’objet ■ S’assurer qu’aucune méthode ne peut être redéfinie ■ Rendre finaux tout les champs ■ Rendre privée tout les attributs ■ Garantir l’accés exclusif à tout composant muable Monday, November 5, 12
  • 14. classes et interfaces ■ ■ ■ ■ Préférer la composition à l’héritage Prévoir et documenter l’héritage ou bien l’interdire Préférer les interfaces aux classes abstraites N’utiliser les interfaces que pour définir les types Monday, November 5, 12
  • 16. méthodes Vérifier la validité d’un paramètre public boolean displayErrors(Set<ConstraintViolation<T>> violations, HasHTML hasHTML){ if (violations == null) throw new NullPointerException("violations must not be null"); if (hasHTML == null) throw new NullPointerException("hasHTML must not be null"); if (hasHTML.getHTML().isEmpty()) throw new IllegalArgumentException("hasHTML.html must not be empty"); ... } ■ A faire au début d’une méthode ■ NPE, IAE, ISE, IOOBE, UOE, ... Monday, November 5, 12
  • 17. méthodes Renvoyer des tableaux et/ou lists vide plutôt que null public List<String> getMessages(){ final List<String> msgs = new ArrayList<String>(); ... // some code (add, ...) return msgs; } ■ Plus besoin de traiter le cas “null” Monday, November 5, 12
  • 18. méthodes ■ Concevoir avec attention la signature d’une méthode ■ Ecrire des commentaires de documentation pour tous les éléments exposés d’une API Monday, November 5, 12
  • 20. exceptions Préférer l’utilisation d’une exception standard public void method(int i) throws Exception{ if(i<0) throw new IllegalArgumentException(“message”); try { // ... } catch (IOException) { // situation récupérable } } ■ Runtime exception : NPE, ... ■ Exception vérifié : IOE, ... ■ Utiliser une exception vérifiée pour une situation récupérable et une exception non vérifié pour une erreur de programmation ■ Ne pas ignorer une exception Monday, November 5, 12
  • 22. threads ■ ■ ■ ■ Monday, November 5, 12 Synchroniser l’accès à toute donnée partagée et muable Eviter toute synchronisation excessive Ne jamais invoquer wait en dehors d’une boucle Eviter les groupes de threads
  • 23. programmation générale (conclusion) ■ ■ ■ ■ ■ ■ ■ ■ Monday, November 5, 12 Minimiser la portée des variables locales Connaître et utiliser les bibliothèques Eviter float et double si un résultat exact est requis Eviter les chaînes de caractères là où d’autres types sont plus appropriés Attention à la performance dans la concaténation de chaînes de caractères Faire référence à un objet via son interface Préférer les interfaces à la réflection Suivre les conventions de nommage généralement acceptées