Skip to content

Commit cff2b48

Browse files
committed
wip: cache fields of commandmoduleitems
1 parent 0ce6c58 commit cff2b48

1 file changed

Lines changed: 23 additions & 6 deletions

File tree

src/main/java/org/scijava/command/CommandModuleItem.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public class CommandModuleItem<T> extends AbstractModuleItem<T> {
5656

5757
private final Field field;
5858

59+
private Class<T> type;
60+
private Type genericType;
61+
private boolean initialized = false;
62+
5963
public CommandModuleItem(final ModuleInfo info, final Field field) {
6064
super(info);
6165
this.field = field;
@@ -75,16 +79,14 @@ public Parameter getParameter() {
7579

7680
@Override
7781
public Class<T> getType() {
78-
final Class<?> type =
79-
GenericUtils.getFieldClasses(field, getDelegateClass()).get(0);
80-
@SuppressWarnings("unchecked")
81-
final Class<T> typedType = (Class<T>) type;
82-
return typedType;
82+
if (!initialized) findTypes();
83+
return type;
8384
}
8485

8586
@Override
8687
public Type getGenericType() {
87-
return GenericUtils.getFieldType(field, getDelegateClass());
88+
if (!initialized) findTypes();
89+
return genericType;
8890
}
8991

9092
@Override
@@ -220,4 +222,19 @@ private <D> D tValue(final String value, final Class<D> type) {
220222
return ConversionUtils.convert(value, saneType);
221223
}
222224

225+
/**
226+
* Helper method to initialize {@link #type} and {@link #genericType} in a
227+
* thread-safe way.
228+
*/
229+
@SuppressWarnings("unchecked")
230+
private synchronized void findTypes() {
231+
if (!initialized) {
232+
final Class<?> untypedType = GenericUtils.getFieldClasses(field, getDelegateClass()).get(0);
233+
type = (Class<T>) untypedType;
234+
235+
genericType = GenericUtils.getFieldType(field, getDelegateClass());
236+
initialized = true;
237+
}
238+
}
239+
223240
}

0 commit comments

Comments
 (0)