IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Effective Java 2] Item 1: Consider static factory methods instead of constructors


Sujet :

Langage Java

  1. #1
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Points : 341
    Points
    341
    Par défaut [Effective Java 2] Item 1: Consider static factory methods instead of constructors
    Bonjour,

    J'ai acheté :
    Effective Java 2nd Revised edition

    On peut retrouver le code source de ce livre ici :
    Code source Effective Java

    Il semble que chaque item du livre peut-être étudié indépendamment.
    Je crée une nouvelle discutions sur le premier item, il est possible que je crée des discussions sur d'autres items.

    Le premier item suggère de considérer s'il n'est pas préférable d'utiliser des méthodes static de création d'objets, en lieu et place de constructeurs.

    Question :
    Une méthode static de création d'objet doit-elle être obligatoirement située hors de la class dont elle crée une instance ?

    J'ai réalisé un petit programme test.
    Beaucoup moins sophistiqué que les exemples fournis avec le livre.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public class AAA01 {
    	private int x;
     
    	private AAA01() {
    	}
     
    	public static AAA01 getAAA01(int x) {
    		AAA01 aaa01 = new AAA01();
    		setX(x) ;
    		return aaa01;
    	}
     
    	private void setX(int x) {
    		this.x = x;
    	}
     
    	private int getX() {
    		return x;
    	}
    }

    Il ne compile pas :
    - Cannot make a static reference to the non-static method setX(int) from the type
    AAA01

    Pourquoi faut-il utiliser une méthode static ?

    Merci,

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Tout d'abord, très bon achat ! Selon moi le meilleur livre pour apprendre à bien programmer en Java.

    Pour répondre à ta question, tu appelles la méthodes setX() directement, sans lui donner un contexte d'objet. Tu appelles donc une méthode d'instance dans un contexte static.

    Pour que ton programme fonctionne, il faut changer la ligne :

    Par
    Afin d'exécuter la méthode setX dans le contexte de l'instance aaa01.

    Le principe de l'item 1 d'EJ, c'est de pouvoir être maître des instances que l'on retourne. Exemple simple : parfois un objet doit être unique, on en fera un singleton. Parfois on en désire seulement deux en mémoire, ce n'est possible qu'en static.

    On peut également nommer les méthodes.

    Par exemple le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> list = new ArrayList<Integer>(2);
    Signifie-t-il qu'on désire une ArrayList de taille 2 ? Ou plutôt qu'on désire une ArrayList contenant déjà l'élément 2 ?

    Avec un constructeur nommé (donc une méthode statique), voici ce que l'on peut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> list = MyArrayList.newListWithCapacity(2);
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Integer> list = MyArrayList.newList(2);
    Dans le premier cas, on a explicitement précisé qu'il s'agissait d'une arrayList dont on renseigne la taille.
    Dans le second cas, nous documenterons le fait qu'on entre déjà la liste des éléments.

    N'est-ce pas plus clair d'avoir des noms spécifiques ?

  3. #3
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    Une méthode static de création d'objet doit-elle être obligatoirement située hors de la class dont elle crée une instance ?
    Non. Cela s'appelle un "constructeur nommé". En effet, contrairement à un constructeur, une méthode statique a un nom.
    Quand la méthode de création se situe dans une autre classe, on parle de manière générale de "Fabrique" (factory).
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  4. #4
    Membre averti
    Avatar de Pierre8r
    Homme Profil pro
    Inscrit en
    Octobre 2004
    Messages
    518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 518
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par dingoth Voir le message

    N'est-ce pas plus clair d'avoir des noms spécifiques ?
    Oui.

Discussions similaires

  1. [unity] static factory généric
    Par anthyme dans le forum Framework .NET
    Réponses: 0
    Dernier message: 06/08/2010, 10h37
  2. Réponses: 2
    Dernier message: 05/11/2009, 11h26
  3. Réponses: 4
    Dernier message: 28/10/2009, 08h05
  4. Réponses: 2
    Dernier message: 01/06/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo