Итак, у меня есть ситуация, когда мне нужно передать три значения в последовательную очередь BlockingQueue:
(SelectableChannel, ComponentSocketBasis, Integer).
На самом деле их вообще не нужно отображать в хэш, и использование HashMap просто смешно, поскольку для каждой записи всегда будет только один ключ; было бы хорошо, если бы они были только в каком-то упорядоченном наборе. Однако из-за отсутствия известной альтернативы я использовал HashMap в своей реализации и создал эту обфусцированную композицию дженериков:
private LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>> deferredPollQueue = new LinkedBlockingQueue<HashMap<HashMap<SelectableChannel, ComponentSocketBasis>, Integer>>();
Это кажется действительно смешным. Я должен быть ужасным n00b. Конечно, есть лучший способ сделать это, который не требует, чтобы я разлагал ключ при извлечении значений или тратил (теоретически - на практике, Java всегда раздутый :) алгоритмическая сложность на бесполезных хэш-вычислениях, которые мне не нужны потому что у меня есть пространство ключей 1 и я даже не хочу реляционно сопоставить три ссылки, а просто сгруппировать их? В этой реализации я должен вытащить значения следующим образом:
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);
}
Я почти уверен, что каждое существо, способное на разумную причину здесь, вероятно, думает, что это нелепый способ сделать это, поэтому вопрос в том - какой правильный путь? :) Я нигде не могу найти доказательства java.util.Pair или java.util.Triplet.
Я полагаю, что «Православный путь» (TM) должен был бы создать пользовательский класс или интерфейс только для того, чтобы вместить этот триплет, но для такой маленькой задачи в такой большой системе это кажется нелепо многословным и ненужным - хотя, опять же, это сама Java.
Точно так же, возможно, значения могут быть помещены в ArrayList или Vector или их производные, но в Java это не дает более краткого способа их решения, чем я выхожу из этой HashMap, хотя здесь это действительно решает проблему алгоритмической сложности, возможно.
Вернувшись на землю Perl, мы бы просто сделали это, используя ссылку на массив в качестве значения внутри массива:
push(@$big_queue_array, [$elem1, \%elem2, \@elem3]);
Какой лучший эквивалент в Java?