Frage

Also, ich habe eine Situation, wo ich in drei Werten in eine serielle Blocking Warteschlange übergeben müssen:

(SelectableChannel, ComponentSocketBasis, Integer).

Sie brauchen nicht wirklich Hash überhaupt abgebildet zu sein, und eine HashMap zu verwenden, ist lächerlich, da es immer nur ein Schlüssel für jeden Eintrag sein wird; es wäre gut, wenn sie in irgendeiner Art von geordneten Menge gerade waren. In Ermangelung einer bekannten Alternative, jedoch habe ich eine HashMap in meiner Implementierung und produziert diese verschleierten Generika Zusammensetzung:

private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();

Das scheint wirklich lächerlich. Ich muss allerdings nicht n00b sein. Sicherlich gibt es einen besseren Weg, dies zu tun, die mich nicht erfordern den Schlüssel zu zersetzen, wenn die Werte abrufen oder die (theoretische Abfall - in der Praxis von Java immer aufgebläht :) algorithmische Komplexität auf eine nutzlose Hash-Berechnung brauche ich nicht weil ich einen Schlüsselraum von 1 habe und will nicht einmal relational die drei Referenzen auf der Karte, sondern nur zu gruppieren? Mit dieser Implementierung muss ich thusly die Werte herausziehen:

while(deferredPollQueue.size() > 0) {
    System.out.println("*** Draining new socket channel from queue");
    HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer> p = deferredPollQueue.take();

    SelectableChannel chan = null;
    ComponentSocketBasis sock = null;
    int ops = 0;

    HashMap<SelectableChannel, ComponentSocketBasis> q = p.keySet().iterator().next();

    chan = q.keySet().iterator().next();
    sock = q.get(chan);

    ops = p.get(q).intValue();

    SelectionKey k = chan.register(selector, ops);  

    if(!channelSupervisorMap.containsKey(k))
        channelSupervisorMap.put(k, sock);
}

Ich bin ziemlich sicher, dass jeder fähig sind empfindungsfähigen Grund dafür ist, hier denkt wahrscheinlich, dass dies eine lächerliche Art und Weise ist, es zu tun, so ist die Frage - was ist der richtige Weg? :) Ich kann nicht Beweise für ein java.util.Pair oder java.util.Triplet überall finden.

Ich nehme an einer orthodoxen Way (TM) eine benutzerdefinierte Klasse oder Schnittstelle zu tun, nur diese Triplett zum Zweck des Gehäuses wäre, aber für eine so kleine Aufgabe in einem so großen System scheint preposterously ausführlich und unecessary - obwohl, dann wieder, das ist Java selbst.

Aus dem gleichen Grunde, vielleicht können die Werte auf einen Arraylist oder ein Vektor oder ein Derivat davon gesetzt werden, aber in Java dies ergibt keine mehr prägnante Art und Weise, sie zu adressieren, als ich hier aus dieser HashMap bekommen, obwohl es macht vielleicht die algorithmische Komplexität Problem lösen.

Zurück in Perl Land, würden wir nur das tun, indem eine Array-Referenz als einen Wert innerhalb eines Arrays mit:

push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);

Was ist die beste Entsprechung in Java?

War es hilfreich?

Lösung

Warum nicht nur Ihr eigenes Generikum Pair oder Triple-Klassen erstellen? So ziemlich jedes Java 5+ Projekt endet sie in ihren eigenen util Klassen mit!

Andere Tipps

Sie sagen, dass eine benutzerdefinierte Klasse der Triplett zu halten wären aufgebläht und unnötig, aber das ist wirklich die Art und Weise, es zu tun, das ist, wie die objektorientierte Modellierung funktioniert. Eine benutzerdefinierte Klasse ist explizit und lesbar ist, und nimmt nicht mehr Laufzeitressourcen als eine allgemeine Halterklasse würde.

Functional Java Paare , Drillinge und Tupel bis zu arity 8. Es gibt auch einen Typ namens HList für willkürliche arity. So Ihre Art wäre:

LinkedBlockingQueue<P3<SelectableChannel, ComponentSocketBasis, Integer>>

Das ist nur eine Bibliothek, so fällt das Glas in Ihrem Classpath und du bist gut zu gehen.

Sie können nur eine Arraylist verwenden, um die Objekte zu speichern, da Sie wissen, was an welcher Stelle wird das Objekt. eine neue Klasse mit den Mitgliedern SelectableChannel und ComponentSocketBasis für die wahrscheinlich besser wäre, zu schaffen.

Wenn Sie vorhaben, diese Art der Sache zu tun viel, jetzt ein generisches Paar oder Tupel sind Sie viel Zeit sparen, aber wenn dies der einzige Ort ist, Sie gehen werden, verwendet wird, dann Erstellen eine neue Klasse wird viel einfacher, führt Code zu lesen.

Wenn Sie Ihren Klassennamen im Code zu sehen, werden Sie genau wissen, was es für, während, wenn Sie nur Ihre allgemeine Verschmelzung sehen, könnte es schwieriger für Sie (oder jemand anderes) einen Sinn zu geben, was es verwendet wird für .

Es ist ein Kompromiss zwischen der Programmierzeit und Lesbarkeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top