Liste de substitution et pratique Java

J’ai trois classes (le nombre augmentera probablement dans le futur):

public inteface Base{ } public class Select implements Base{ } public class Ast implements Base{ } public class Gt implements Base{ } 

J’ai aussi besoin d’un cours de List

 BaseList extends ArrayList{ public boolean add(Base b){ throw new UnsupportedOperationException("You should use add%ConcereteBaseType% method instead"); } public boolean add(Select s){ } public boolean add(Ast a){ } public boolean add(Gt g){ } } 

La raison pour laquelle j’ai fait cela est le fait que je ne veux pas que quiconque ajoute des éléments via un pointeur sur Base . Dans ma situation concrète, cela serait dangereux.

Mais l’inconvénient est qu’il ne sera découvert qu’au moment de l’exécution.

J’ai aussi besoin de parcourir la liste.

Est-ce une bonne pratique de faire de telles choses?

Utiliser une interface c’est bien. (Faire de la Base une classe abstraite ne vous rapportera rien ici.)

Cependant, vous devriez préférer la composition à l’inheritance et implémenter Iterable pour pouvoir l’utiliser dans les boucles for for améliorées, etc.

 class BaseList implements Iterable { private List list = new ArrayList<>(); public boolean add(Select s) { return list.add(s); } public boolean add(Ast a) { return list.add(a); } public boolean add(Gt gt) { return list.add(gt); } @Override public Iterator iterator() { return Collections.unmodifiableList(list).iterator(); } } 

Vous pouvez ensuite parcourir la liste comme suit:

 for (Base b : yourBaseList) { ... } 

Vous pourriez faire de Base une classe abstract , car celles-ci ne pourraient jamais être instanciées, votre liste serait en sécurité.

Mon chemin: je ne comprends vraiment pas pourquoi vous voudriez lancer une exception pour add(Base b) lorsque base est une interface qui elle-même ne peut jamais être un object.

Sinon, utilisez le modèle delegate / wrapper, ce qui signifie: Ne pas étendre ArrayList , mais créer une classe contenant un ArrayList.

 class BaseList { private List list = new ArrayList<>(); public boolean add(Select s) { return list.add(s); } //etc }