2017-05-04 2 views
-2
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

Qu'est-ce qui vous fait supposer que ce n'est pas déjà fait? – Stultuske

+2

La classe 'Date' est mutable, donc vous ne devez pas exposer votre champ' date' dans le getter. – khelwood

+0

Ne l'exposez pas, vous n'aurez pas ce problème. – byxor

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.

+1

Encore mieux, utilisez la bibliothèque java.time immuable. – shmosel

+0

@shmosel Bonne idée. – khelwood

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.