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 :
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
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(); } }
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
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); } }
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 immutableObject.getDateValue().setMonth(Calendar.FEBRUARY);
Je ne sais pas comment faire, vers quoi m'orienter.
Merci d'avance.
Cordialement, Smori.
Partager