Cela montre pourquoi il est important de " Faire référence aux objets par leurs interfaces "comme décrit dans Java efficace livre.
Si vous codez en fonction de l'implémentation et utilisez ArrayList à, disons, 50 endroits dans votre code, lorsque vous trouverez une bonne implémentation de "liste" qui compte les éléments, vous devrez changer ces 50 endroits, et probablement casser votre code (si vous êtes le seul à l'utiliser, ce n'est pas un problème, mais si quelqu'un d'autre l'utilise, vous casserez aussi son code).
En programmant l'interface, vous pouvez laisser ces 50 emplacements inchangés et remplacer l'implémentation de ArrayList par "CountItemsList" (par exemple) ou une autre classe.
Vous trouverez ci-dessous un exemple très simple de rédaction. Ce n'est qu'un exemple, une liste prête pour la production serait beaucoup plus compliqué.
import java.util.*;
public class CountItemsList<E> extends ArrayList<E> {
// This is private. It is not visible from outside.
private Map<E,Integer> count = new HashMap<E,Integer>();
// There are several entry points to this class
// this is just to show one of them.
public boolean add( E element ) {
if( !count.containsKey( element ) ){
count.put( element, 1 );
} else {
count.put( element, count.get( element ) + 1 );
}
return super.add( element );
}
// This method belongs to CountItemList interface ( or class )
// to used you have to cast.
public int getCount( E element ) {
if( ! count.containsKey( element ) ) {
return 0;
}
return count.get( element );
}
public static void main( String [] args ) {
List<String> animals = new CountItemsList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
System.out.println( (( CountItemsList<String> )animals).getCount( "bat" ));
}
}
Principes OO appliqués ici : héritage, polymorphisme, abstraction, encapsulation.
0 votes
C'est l'une des raisons pour lesquelles vous devriez programmer en fonction d'une interface plutôt que d'une implémentation. Si vous trouvez la bonne collection, vous devrez modifier le type pour utiliser cette collection. Je vais poster une réponse à ce sujet.