web-dev-qa-db-fra.com

Déclarer une LinkedList en Java

J'apprends toujours que lorsque nous déclarons une collection, nous devrions faire, Interface ob = new Class(), si je veux utiliser par exemple un LinkedList, je ferai List ob = new LinkedList(), mais je ne peux pas accéder à toutes les méthodes de LinkedList .. N'est-ce pas LinkedList ob = new LinkedList() 100% correct? 

9
Márcio Duarte

LinkedList ob = new LinkedList () 100% n'est-il pas correct?

Bien, je suggérerais d'utiliser le formulaire générique, mais bien sûr - si vous souhaitez utiliser une fonctionnalité qui est spécifique à LinkedList, vous devez déclarer la variable en conséquence.

Vous voudrez peut-être vérifier si les interfaces Deque<E> ou Queue<E> ont ce que vous voulez. S'ils le font, utilisez ceux qui correspondent à l'idée de décrire ce dont vous avez besoin plutôt que la mise en œuvre que vous utiliserez.

11
Jon Skeet

Oui,

LinkedList<...> items = new LinkedList<...>();

est parfaitement correct si vous savez que items dépendra des méthodes de LinkedList<T> qui ne sont pas capturées dans l'interface List<T>.

6
ruakh

Vous devez toujours essayer de conserver la déclaration au niveau le plus élevé possible , ce qui signifie que vous devez vous arrêter au niveau le plus élevé offrant toutes les fonctionnalités dont vous avez besoin: si les méthodes List ne suffisent pas, votre LinkedList déclaration.

4
michele b

la règle "toujours code aux interfaces" doit être prise avec une certaine flexibilité. ce que vous proposez va bien, et comme vous êtes arrivé à la conclusion, la seule option.

en tant que note latérale, la plupart des machines virtuelles (JVM) codent pour des classes concrètes comme celle-ci. décider si la performance vaut la peine d'enfreindre la règle est la chose la plus difficile à décider. 

3
Jeffrey Blattman

Si vous avez réellement besoin d'utiliser des méthodes qui ne figurent pas dans l'interface List, l'utilisation de l'API de LinkedList ne présente aucun inconvénient. La règle générale de programmation pour l'interface Liste reconnaît 1) qu'il est assez rare d'avoir besoin de ces méthodes et 2) l'expérience de la plupart des gens, il est beaucoup plus probable que je découvre que je dois trier la liste et/ou utiliser beaucoup de méthodes aléatoires. accès, et décidez de passer à un ArrayList, alors il me faut l’une des méthodes dont dispose seulement LinkedList.

Il se peut également que vous programmiez l'interface de la file d'attente si vous trouvez que List ne vous donne pas ce dont vous avez besoin.

3
Affe

LinkedList est un générique. Vous devriez faire:

LinkedList<String> linkedList = new LinkedList<String>();

(ou tout ce que vous avez besoin de stocker à la place de String)

2
Eugene Feingold

Pas tout à fait correct.

Un moyen privilégié de déclarer une collection consiste à inclure le type de données qu'il contient. Donc, pour votre exemple, ce serait LinkedList<Integer> ob = new LinkedList<Integer>();.

1
Makoto

Non .. Cela serait faux, à un stade ultérieur s'il souhaite changer son implémentation de liste liée à une autre implémentation de type liste, il se trompera ... Il est donc préférable d'utiliser la déclaration de niveau d'interface.

1
Punith Raj

vous pouvez toujours accéder aux méthodes LinkedList en utilisant List, tout ce que vous avez à faire est de taper cast par exemple

((LinkedList)ob).add()

L'utilisation de génériques List et non de LinkedList réside dans le fait que dans le cas où vous changez simplement le type de listes que vous utilisez (disons liste double liée), votre programme fonctionnera toujours

0
John Demetriou

Je ne vous suggérerai pas toujours d'utiliser des génériques ..... Coz vous aurez parfois besoin d'envelopper différents objets comme ici ....

          String str="a string";
          boolean status=false;

          LinkedList ll = new LinkedList();
          ll.add(str);
          ll.add(status);

Dans certaines situations comme le cas de RMI, vous ne pouvez envoyer que des données sérialisées ... et supposez que vous vouliez envoyer un objet de classe (non sérialisé) primitives) dans une LinkedList et transmettez cet objet dans son ensemble ....... ne vous inquiétez pas du grand nombre d’arguments ......

       public Class DataHouse
       {
             public int a;
             public String str;
             .
             .
             .
       }

Maintenant Quelque part, vous devez passer les objets .... Vous pouvez faire ce qui suit ....

             DataHouse dh =new DataHouse();
             LinkedList ll = new LinkedList();
             ll.add(dh.a);
             ll.add(dh.str);

             // Now the content is serialized and can pass it as a capsuled data......
0
Arjun K P