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

avec Java Discussion :

[Objet immuable] Comment faire ?


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 16
    Points : 28
    Points
    28
    Par défaut [Objet immuable] Comment faire ?
    Bonjour,

    Je recherche à faire des objets immuables, J'ai trouvé un exemple sur internet mais quelque chose ne me satisfait pas.

    Voici mon objet immuable :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    package smori.ode.webapp.immutables;
     
    import java.sql.Date;
     
    public final class ImmutableObject {
     
    	private Date dateValue;
     
    	/**
             * @param dateValue
             */
    	public ImmutableObject(Date dateValue) {
    		super();
    		this.dateValue = dateValue;
    	}
     
    	/**
             * @return the dateValue
             */
    	public Date getDateValue() {
    		return new Date(dateValue.getTime());
    	}
     
    	/* (non-Javadoc)
    	 * @see java.lang.Object#toString()
    	 */
    	@Override
    	public String toString() {
    		StringBuffer stringBuffer = new StringBuffer();
    		stringBuffer.append("[ImmutableObject:");
    		stringBuffer.append("dateValue=");
    		stringBuffer.append(dateValue);
    		stringBuffer.append(']');
    		return stringBuffer.toString();
    	}
     
    }
    Voici sont utilisation :
    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
     
    package smori.ode.webapp.immutables;
     
    import java.sql.Date;
    import java.util.Calendar;
     
    import org.junit.Test;
     
    public class ImmutableObjectTest {
     
    	@SuppressWarnings("deprecation")
    	@Test
    	public void testGetString() {
    		ImmutableObject immutableObject = new ImmutableObject(new Date(01, Calendar.JANUARY, 01));
    		immutableObject.getDateValue().setMonth(Calendar.FEBRUARY);
    		System.out.println(immutableObject);
    	}
     
     
    }
    Comme on peut le voir, le getter retournant une copie, mon objet immuable n'est pas modifié. Malheureusement, le développeur peut tenter un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    immutableObject.getDateValue().setMonth(Calendar.FEBRUARY);
    Même si cela n'as aucun impacte sur l'objet immuable je souhaiterais interdire ce comportement par exemple par le lancement d'une exception.

    Je ne sais pas comment faire, vers quoi m'orienter.

    Merci d'avance.
    Cordialement, Smori.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 565
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Bonjour,

    Ben tu peux rien faire, ou du moins, tout ce que tu peux faire c'est créer ta propre classe Date, et celle-ci la faire immutable.
    Mais bien sûr elle ne sera pas utilisable par l'existant qui travaille sur des java.util.Date

    Autre possibilité : étendre la classe java.util.Date et redéfinir toutes ses méthodes qui permettent de changer l'état de l'objet. Mais ça t'attirera des ennuis avec l'existant qui compte sur le fait qu'il a le droit de muter l'objet et que l'appelant n'avait plus l'intention de s'en servir.

  3. #3
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    c'est d'ailleurs une des erreurs les plus curieuses des librairies initiales de Java:
    une date étant par essence une valeur immuable (on ne peut pas changer un premier Avril en 32 mars) il est bizarre de créer un objet Date qui le soit.
    après si on veut créer quelque chose qui se balade dans le calendrier pourquoi pas mais c'est pas une "Date".

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le problème c'est surtout que cette classe n'est pas totalement immuable.
    Pour faire une classe immuable il faut protéger tous les "accès" aux attributs immuables, que ce soit en lecture ou en écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Date date = new Date();
    ImmutableObject obj = new ImmutableObject(date);
     
    date.setMonth(Calendar.FEBRUARY); // On modifie l'ImmutableObject !!!

    Il faut aussi protéger le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public ImmutableObject(Date dateValue) {
    		super();
    		this.dateValue = new Date(dateValue.getTime());
    	}

    a++

Discussions similaires

  1. Réponses: 10
    Dernier message: 16/08/2013, 21h03
  2. Collection d'objets polymorphes: Comment faire ?
    Par sapin dans le forum Débuter
    Réponses: 25
    Dernier message: 19/06/2008, 13h32
  3. Réponses: 3
    Dernier message: 19/07/2007, 10h39
  4. Réponses: 2
    Dernier message: 05/07/2005, 17h40
  5. comment faire pour imprimer à l'écran un objet
    Par GConstant dans le forum Général Python
    Réponses: 10
    Dernier message: 11/08/2004, 11h31

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