Étant donné les entités ci-dessous - est-il possible d'éviter en quelque sorte d'utiliser des classes internes anonymes marquées par /***** Get rid of this anonymous inner class ******/
. Le problème est que "SomeEntity
" peut contenir des centaines de champs et qu'il existe plusieurs classes implémentant cette interface, chacune d'entre elles nécessitant des méta-informations. Cela signifie que des milliers de classes internes anonymes commencent à être générées, ce qui fait que mon temps de compilation est vraiment très lent et que le temps de démarrage du système est vraiment lent lorsque le chargeur de classe charge toutes les classes.Alternatives pour les classes internes anonymes en Java
Je ne peux pas utiliser la réflexion parce que mes cours se brouillées avant la sortie
public interface SomeEntity {
///// boolean someField
// getter
void someField(boolean someField);
// setter
boolean someField();
final static String someField = "someField";
///// boolean someField2
// getter
void someField2(int someField2);
// setter
int someField2();
final static String someField2 = "someField2";
}
public class SomeEntityImpl implements SomeEntity {
boolean someField = false;
int someField2 = 0;
@Override
public void someField(boolean someField) {
this.someField = someField;
}
@Override
public boolean someField() {
return this.someField;
}
@Override
public void someField2(int someField2) {
this.someField2 = someField2;
}
@Override
public int someField2() {
return someField2;
}
}
public class SomeEntityMeta {
public static interface Meta<T> {
T get(SomeEntity x);
void set(SomeEntity x, T t);
void copy(SomeEntity from, SomeEntity to);
}
Meta<Boolean> metaForSomeField = new Meta<Boolean>() {
@Override
public Boolean get(SomeEntity x) {
return x.someField();
}
@Override
public void set(SomeEntity someEntity, Boolean newFieldValue) {
someEntity.someField(newFieldValue);
}
@Override
public void copy(SomeEntity from, SomeEntity to) {
to.someField(from.someField());
}
};
Meta<Integer> metaForSomeField2 = new Meta<Integer>() {
@Override
public Integer get(SomeEntity someField2) {
return someField2.someField2();
}
@Override
public void set(SomeEntity someEntity, Integer newFieldValue) {
someEntity.someField2(newFieldValue);
}
@Override
public void copy(SomeEntity from, SomeEntity to) {
to.someField2(from.someField2());
}
};
Map<String, Meta<?>> metaMapForAllFields = new HashMap<String, Meta<?>>() {
private static final long serialVersionUID = 1L;
{
put(SomeEntity.someField, metaForSomeField);
put(SomeEntity.someField2, metaForSomeField2);
}
};
}
// used as follows:
public final static void main(String[] args) {
SomeEntity someEntity = new SomeEntityImpl();
SomeEntityMeta entityMeta = new SomeEntityMeta();
///
Map<String, Object> fieldNameValueMap = getFieldNameValueMapFromExternalsSystem();
for (Entry<String, Object> fieldNameValueEntry : fieldNameValueMap.entrySet()) {
Meta<Object> meta = (Meta<Object>) entityMeta.metaMapForAllFields.get(fieldNameValueEntry.getKey());
meta.set(someEntity, fieldNameValueEntry.getValue());
}
}