Ces deux mot-clefs n'ont pas du tout le même objectifs...Envoyé par grunt2000
Disons que l'utilisation des const est remplacé par des classes immuables...Envoyé par grunt2000
Non j'ai juste demandé des informations supplémentairesEnvoyé par grunt2000
Le problème n'est pas le même : si ta classe aurait été immuable tu n'aurais pas eu à utiliser const...
Lorsqu'un bon de commande est créé il ne varie plus, donc il est inutile d'avoir à modifier ses attribut...
Perso j'aurais donc utiliser seulement des classes immuables (avec eventuellement un Builder pour les créer), par exemple si Client et Article sont immuable, j'écrirais écrit ceci :
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 public final class BonDeCommande { /** Le client qui a commandé. */ private final Client client; /** Le prix total de sa commande. */ private final double prix; /** La composition de sa commande. */ private final List<Article> articles; public BonDeCommande(Client client, List<Article> articles) { this.client = client; // On protège la List qui est un objet modifiable this.articles = Collections.unmodifiableList(new ArrayList<Article>(articles)); double p = 0; for (Article a : this.articles) { p += a.getPrix(); } this.prix = p; } public Client getClient() { return client; } public double getPrix() { return prix; } public Iterable<Article> getArticles() { return articles; } }
Maintenant si tu as une classe muable :
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 public class BonDeCommande { /** Le client qui a commandé. */ private final Client client; /** Le prix total de sa commande. */ private final double prix; /** La composition de sa commande. */ private final List<Article> articles; public Client getClient() { return client; } public double getPrix() { return prix; } public void setClient(Client c) { this.client = c; } public void setPrix(double d) { this.prix = d; } public void addArticle(Article a) { this.articles.add(a); } public Iterable<Article> getArticles() { return articles; } }
Et que tu veux reprendre le principe du const il faut utiliser une interface qui serait implémenté par ta classe principale :
Et là tu obtiens les mêmes possibilités qu'avec un const sur une classe mutable...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public interface BonDeCommandeInterface { public Client getClient(); public double getPrix(); public Iterable<Article> getArticles(); }
On ne le critique pas et on n'a pas dit qu'il s'agissait d'une pratique meilleure !Envoyé par grunt2000
On a simplement dit que l'immuabilité est plus dans la philosophie de Java... alors que tu adoptes plus une approche C++ pas très adapté à Java (et donc tu déplores l'absence du const primordiale en C++)
a++
Partager