Skip to content

Commit 9d6f8de

Browse files
committed
Prefer Multimap subtypes and MultimapBuilder
Guava team recommends using the subinterfaces of Multimap, for the same reasons they recommend using Set and List rather than Collection: it documents expectations about ordering, uniqueness, and behavior of equals. They also recommends MultimapBuilder over specific Multimap implementations, so callers don't have to know the specific key/value behaviors of the individual implementations. The static factory methods in the implementations will be removed in a later version. Change-Id: Iababa60c8d2946a390ccc8cd9c7327184e6f6258
1 parent 05aaedc commit 9d6f8de

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

gitiles-servlet/src/main/java/com/google/gitiles/doc/TocFormatter.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414

1515
package com.google.gitiles.doc;
1616

17-
import com.google.common.collect.ArrayListMultimap;
1817
import com.google.common.collect.Iterables;
18+
import com.google.common.collect.ListMultimap;
1919
import com.google.common.collect.Maps;
20-
import com.google.common.collect.Multimap;
20+
import com.google.common.collect.MultimapBuilder;
2121
import com.google.gitiles.doc.html.HtmlBuilder;
2222
import java.util.ArrayDeque;
2323
import java.util.ArrayList;
@@ -47,7 +47,8 @@ class TocFormatter {
4747

4848
void setRoot(Node doc) {
4949
outline = new ArrayList<>();
50-
Multimap<String, TocEntry> entries = ArrayListMultimap.create(16, 4);
50+
ListMultimap<String, TocEntry> entries =
51+
MultimapBuilder.hashKeys(16).arrayListValues(4).build();
5152
scan(doc, entries, new ArrayDeque<Heading>());
5253
ids = generateIds(entries);
5354
}
@@ -113,7 +114,7 @@ private void outline(Heading h) {
113114
.close("li");
114115
}
115116

116-
private void scan(Node node, Multimap<String, TocEntry> entries, Deque<Heading> stack) {
117+
private void scan(Node node, ListMultimap<String, TocEntry> entries, Deque<Heading> stack) {
117118
if (node instanceof Heading) {
118119
scan((Heading) node, entries, stack);
119120
} else {
@@ -123,7 +124,7 @@ private void scan(Node node, Multimap<String, TocEntry> entries, Deque<Heading>
123124
}
124125
}
125126

126-
private void scan(Heading header, Multimap<String, TocEntry> entries, Deque<Heading> stack) {
127+
private void scan(Heading header, ListMultimap<String, TocEntry> entries, Deque<Heading> stack) {
127128
if (header.getLevel() == 1) {
128129
countH1++;
129130
}
@@ -161,8 +162,9 @@ private static NamedAnchor findAnchor(Node node) {
161162
return null;
162163
}
163164

164-
private Map<Heading, String> generateIds(Multimap<String, TocEntry> entries) {
165-
Multimap<String, TocEntry> tmp = ArrayListMultimap.create(entries.size(), 2);
165+
private Map<Heading, String> generateIds(ListMultimap<String, TocEntry> entries) {
166+
ListMultimap<String, TocEntry> tmp =
167+
MultimapBuilder.hashKeys(entries.size()).arrayListValues(2).build();
166168
for (Collection<TocEntry> headers : entries.asMap().values()) {
167169
if (headers.size() == 1) {
168170
TocEntry entry = Iterables.getOnlyElement(headers);

0 commit comments

Comments
 (0)