РЕДАКТИРОВАТЬ :
Это действительно можно упростить, как предлагает Хольгер:
Map<String, BiFunction<ByteBuffer, Integer, AbstractID3v2FrameBody>> LOOKUP = Map.of(
FRAME_ID_AUDIO_ENCRYPTION, FrameBodyAENC::new,
FRAME_ID_ATTACHED_PICTURE, FrameBodyAPIC::new
);
А затем так же просто, как:
LOOKUP.get(ID3v24Frames.FRAME_ID_AUDIO_ENCRYPTION)
.apply(byteBuffer, frameSize);
ПРЕДЫДУЩЕЕ ПРЕДЛОЖЕНИЕ
Это всего лишь образец, вам нужно будет адаптировать его для ваших классов:
private static final Lookup L = MethodHandles.lookup();
private static final MethodHandle CONS;
static {
try {
CONS = L.findConstructor(SomeClass.class, MethodType.methodType(void.class, int.class));
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
private static final Map<String, MethodHandle> LOOK_UP = Map.of(
"SOME_CLASS", CONS
);
public static void main(String[] args) {
try {
SomeClass sc = (SomeClass) LOOK_UP.get("SOME_CLASS").invokeExact(42);
System.out.println(sc.getX());
} catch (Throwable t) {
t.printStackTrace();
}
}
static class SomeClass {
private final int x;
public SomeClass(int x) {
this.x = x;
}
public int getX() {
return x;
}
}