Je crée plusieurs fonctions dans lesquelles je veux retourner l'interface au lieu de l'implémentation, I.E. Liste au lieu de ArrayList. Ma méthode signature et une brève mise en œuvre suit:Java 6 Collections.checkedList utilisation appropriée
public List<MyAwesomeComposedObject> convert(Collection<MyAwesomeObject> awesomeObjects>)
{
List<MyAwesomeComposedObject> composedObjects = new ArrayList<MyAwesomeComposedObject>();
for(MyAwesomeObject awesomeObject : awesomeObjects)
{
MyAwesomeComposedObject composedObject = new MyAwesomeComposedObject(awesomeObject);
composedObjects.add(composedObject);
}
List<MyAwesomeComposedObject> composedObjectList = Collections.checkedList<composedObjects, MyAwesomeComposedObject.class);
return composedObjectList;
}
Ma question est, est-ce un anti-modèle de quelque sorte? Je veux garantir que l'invocateur de cette méthode obtient l'interface au lieu d'une implémentation. Je ne crois pas non plus qu'il s'agisse d'un cas de sur-ingénierie. Si ce n'est pas la bonne façon de retourner une interface, dans ce scénario, je suis ouvert à l'implémentation correcte.
Attaché est un petit programme qui donne lieu à une exception:
public static void main(String[] args)
{
Vector v = (Vector) c();
}
static List<Object> c()
{
List<Object> l = new ArrayList<Object>();
l.add(new Object());
List<Object> o = Collections.checkedList(l, Object.class);
return o;
}
Le javadoc est ici: checked list
Je ne vois pas quel est le problème; la signature de la méthode garantit que l'appelant obtient une «liste» par définition. –
J'ai mis à jour ma question, Vector implémente l'interface List, ce code ci-dessus échoue. – Woot4Moo
Il échoue car un 'ArrayList' n'est pas un' Vector'. C'est pourquoi les codeurs ne devraient pas passer d'une interface à un type concret à moins qu'ils ne soient absolument sûrs que l'instance est vraiment une instance du type concret. Il n'y a aucun moyen d'empêcher les gens de faire des choses mal avisées comme celles-ci, sauf l'éducation. –