public final class Test {
private final Date date;
public Test() {
date = new Date();
}
public Test(Date date) {
this.date = date;
}
public Date getDate() {
return date;
}
public String toString() {
return "Test:[date=" + date.toString() + "]";
}
}
-2
A
Répondre
6
Les instances de votre classe ne peuvent pas être modifiées en tant que telles, mais étant donné que Date
est modifiable (en supposant que ce soit java.util.Date
), les informations qu'elles contiennent peuvent être modifiées.
Par exemple:
myTest.getDate().setTime(0L);
Si vous voulez protéger contre cela, vous devez copier le Date
défensivement.
public Test(Date d) {
this.date = new Date(d.getTime());
}
public Date getDate() {
return new Date(this.date.getTime());
}
que rien de chemin en dehors de la classe peut avoir accès à votre champ date
à muter.
Vous pouvez également utiliser un type de date immuable tel que LocalDate
ou LocalDateTime
au lieu d'un type mutable.
0
Renvoyer un clone des objets de date à la place.
public final class Test {
private final Date date;
public Test() {
date = new Date();
}
public Test(Date date) {
this.date = (Date)date.clone();
}
public Date getDate() {
return (Date)date.clone();
}
public String toString() {
return "Test:[date=" + date.toString() + "]";
}
}
Si vous avez des problèmes de performance en ce qui concerne la création de nouveaux objets, vous pouvez à la place du temps de magasin comme long
au lieu d'un objet Date
.
Qu'est-ce qui vous fait supposer que ce n'est pas déjà fait? – Stultuske
La classe 'Date' est mutable, donc vous ne devez pas exposer votre champ' date' dans le getter. – khelwood
Ne l'exposez pas, vous n'aurez pas ce problème. – byxor