Non l'ho mai capito: perché non riesco a trovare una API di raccolte di base da qualche parte che mi consenta di recuperare elementi che hanno un metodo diretto .next () o .previous () su di essi senza tutto il boilerplate o dover implementare la mia versione di LinkDList. Il vantaggio? Posso scorrere direttamente i miei elementi restituiti senza la necessità di un iteratore, il che mi sembra un possibile motivatore principale di avere una LinkedList in primo luogo.
class Link { ... }
LinkedList<Link> linksByPosition = ...
Map<String,Link> linksByName = ...
Link linkWithName = linksByName.get("name");
Link nextLink = ??? // Do you get how complex it is?
Riesci a capire quanto sia complesso il ???
? Devo considerare una scansione di ogni elemento per trovare quello corrispondente prima di sapere in che posizione si trova, prima che possa ottenere il prossimo ...
Ora considera questa forma modificata, con un SmarterLinkedList
che mi restituisce le implementazioni di un LinkdListNode
predefinito.
class Link extends AbstractLinkedListNode<Link> { ... }
SmarterLinkedList<Link> linksByPosition = ...
Map<String,Link> linksByName = ...
Link linkWithName = linksByName.get("name");
Link nextLink = linkWithName.next();
Se internamente, sta già monitorando il collegamento, perché non vorresti esporre quella parte dell'API allo sviluppatore? Mi sembra infinitamente utile?
Ora diciamo, renderò i requisiti un po 'più complessi, ora voglio anche aggiungere un elemento subito dopo quello che sto tenendo. Nella prima versione del codice, mentre cerco il Link
corrispondente, posso anche mantenere un indice quindi so a che punto inserire. In questo modo posso chiamare il metodo LinkedList.add(index+1,newLink)
. Sai cosa sta facendo dietro le quinte, giusto? Sì, internamente, di nuovo itera alla giusta posizione index+1
volte finché non raggiunge la posizione corretta per l'inserimento.
Tuttavia se LinkedListNode
mi richiede anche di esporre i metodi per insertAfter
, insertBefore
, removeSelf
... lo rende più potente, vero?
UPDATE
Sembra già che il consenso sarà "implementare uno tuo". Ma sto pensando che "codice troppo generico" può essere evitato senza rischiare eccessivamente esponendo gli interiora della gestione dei nodi.
Spero che alla fine qualcuno inciamperà su questo, e dimmi che c'è qualcosa che lo offre esattamente.