Skip to content

Commit 49e1354

Browse files
committed
refactored reflection-based enum template builder
1 parent db2f76a commit 49e1354

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

src/main/java/org/msgpack/template/builder/ReflectionOrdinalEnumTemplateBuilder.java

+14-19
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919

2020
import java.io.IOException;
2121
import java.lang.reflect.Type;
22-
import java.util.HashMap;
23-
import java.util.Map;
2422

2523
import org.msgpack.MessageTypeException;
2624
import org.msgpack.annotation.MessagePackOrdinalEnum;
@@ -31,39 +29,33 @@
3129
import org.msgpack.template.TemplateRegistry;
3230
import org.msgpack.template.builder.TemplateBuildException;
3331
import org.msgpack.unpacker.Unpacker;
32+
import org.slf4j.Logger;
33+
import org.slf4j.LoggerFactory;
3434

3535

3636
public class ReflectionOrdinalEnumTemplateBuilder extends AbstractTemplateBuilder {
3737

38+
private static final Logger LOG = LoggerFactory.getLogger(ReflectionOrdinalEnumTemplateBuilder.class);
39+
3840
static class ReflectionOrdinalEnumTemplate<T> extends AbstractTemplate<T> {
3941
private T[] entries;
4042

41-
private Map<T, Integer> reverse;
42-
4343
ReflectionOrdinalEnumTemplate(Class<T> targetClass) {
4444
entries = targetClass.getEnumConstants();
45-
reverse = new HashMap<T, Integer>();
46-
for (int i = 0; i < entries.length; ++i) {
47-
reverse.put(entries[i], i);
48-
}
4945
}
5046

5147
@Override
5248
public void write(Packer pk, T target, boolean required) throws IOException {
53-
Integer ord = reverse.get(target);
54-
if (ord == null) {
55-
throw new MessageTypeException();
56-
}
57-
pk.writeInt((int) ord);
49+
pk.writeInt(((Enum) target).ordinal());
5850
}
5951

6052
@Override
6153
public T read(Unpacker pac, T to, boolean required) throws IOException, MessageTypeException {
62-
int ord = pac.readInt();
63-
if (entries.length <= ord) {
64-
throw new MessageTypeException();
54+
int ordinal = pac.readInt();
55+
if (ordinal < 0 || ordinal >= entries.length) {
56+
throw new MessageTypeException("illegal ordinal");
6557
}
66-
return entries[ord];
58+
return entries[ordinal];
6759
}
6860
}
6961

@@ -73,8 +65,11 @@ public ReflectionOrdinalEnumTemplateBuilder(TemplateRegistry registry) {
7365

7466
@Override
7567
public boolean matchType(Type targetType) {
76-
return AbstractTemplateBuilder.isAnnotated((Class<?>) targetType, OrdinalEnum.class)
77-
|| AbstractTemplateBuilder.isAnnotated((Class<?>) targetType, MessagePackOrdinalEnum.class);
68+
Class<?> targetClass = (Class<?>) targetType;
69+
boolean match = AbstractTemplateBuilder.isAnnotated(targetClass, OrdinalEnum.class)
70+
|| AbstractTemplateBuilder.isAnnotated(targetClass, MessagePackOrdinalEnum.class);
71+
LOG.debug("matched type: " + targetClass.getName());
72+
return match;
7873
}
7974

8075
@Override

0 commit comments

Comments
 (0)