![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
tchize_
Note, en "plus propre", il reste aussi la solution de l'enum
![;)](https://www.developpez.net/forums/images/smilies/icon_wink.gif)
Ce n'est pas "plus propre"...
Tu joues avec les Generics et le type de retour, mais cela te génère des warnings "unchecked" sur les méthodes transform() de tes enums...
Cela peut paraitre insignifiant, mais en fait cela indique que le compilateur ne peut pas s'assurer de la cohérence des types.
C'est dangereux car cela pourrait engendrer des erreurs inattendus plus loin.
Par exemple avec le code suivant, qui pourrait être utilisé involontairement (un mauvais copier/coller est si vite arrive
) :
List<Mail> mails = DataType.TEL.transform(strings);
En réalité on crée une List<Tel> qu'on affecte à une List<Mail>.
Le problème c'est que ce code ne génère aucune erreur ni warning à la compilation, et qu'il s'exécute également sans problème !!!!
Du coup on se retrouve avec une List<Mail> vérolée, qui risque de nous générer une ClassCastException n'importe quand.
Et c'est très problématique car l'erreur peut survenir bien loin du code incriminé, ce qui peut engendrer des séances de débug vraiment affreuse !!!
Les warning "unchecked" sont à éviter comme la peste.
Si tu veux rester sur une solution proche, il serait préférable de passer par une classe abstraite et des champs static final :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| abstract class DataType<T> {
public static final DataType<Mail> MAIL = new DataType<Mail>() { @Override protected Mail transform(String item) {return new Mail(item);} };
public static final DataType<Tel> TEL = new DataType<Tel>() { @Override protected Tel transform(String item) {return new Tel(item);} };
public static final DataType<Tag> TAG = new DataType<Tag>() { @Override protected Tag transform(String item) {return new Tag(item);} };
public List<T> transform(String... items){
ArrayList<T> o = new ArrayList<T>();
for (String s: items)
o.add(this.transform(s));
return o;
}
protected abstract T transform(String item);
} |
Là tu as un vérification du type par le compilateur, et un code type-safe ![;)](https://www.developpez.net/forums/images/smilies/icon_wink.gif)
a++
Partager