2010-10-29 4 views
1

É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()); 
      } 
     } 

Répondre

2

Je suggère faire SomeEntity un composite d'objets simples, qui supprimerait la nécessité pour vos petits méta classes.

(Quelqu'un mentionnera bientôt réflexion ou JavaBeans, je suggère d'essayer de résoudre le problème de conception en premier.)

Questions connexes