2009-04-14 6 views
3

Étant donné une interface ou des interfaces, quel est le meilleur moyen de générer une implémentation de classe?Objets de valeur générés automatiquement

interface Vehicle 
{ 
    Engine getEngine(); 
} 

@Generated 
class Car implements Vehicle 
{ 
    private final Engine engine; 

    public Car(Engine engine) 
    { 
     this.engine = engine; 
    } 

    public Engine getEngine() 
    { 
     return engine; 
    } 

    // generated implementation of equals, hashCode, toString, 
} 

Les variables de classe doivent être dérivées des méthodes getter de l'interface. Idéalement, les types de retour covariant dans les interfaces seraient traités. La mise en œuvre devrait favoriser l'immutabilité en utilisant des variables finales privées et l'instanciation du constructeur. Les méthodes equals, hashCode et toString doivent être générées.

Répondre

3

La méthode nettoyeuse utilise CGLIB pour générer dynamiquement la classe lors de l'exécution. Évidemment, vous n'êtes pas capable de parcourir le fichier source.

Si vous avez besoin du fichier source, vous pouvez essayer codemodel et faire quelque chose comme:

JCodeModel cm = new JCodeModel(); 
x = cm._class("foo.bar.Car"); 
x.field(Engine.class, "engine"); 
for (PropertyDescriptor pd: Introspector. 
       getBeanInfo(Vehicle.class).getPropertyDescriptors()) { 
    g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
    g.body()... 
    s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName()); 
    s.body()... 
} 
hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode")); 
hc.body()... 
cm.build(new File("target/generated-sources")); 

Ou comme suggéré précédemment, utilisez l'IDE (dans Eclipse: Menu "Source", « Générer hashcode() et equals() ... ", ie)

+0

Je vais essayer JCodeModel. Merci! – parkr

1

Faites comme eclipse lorsque vous implémentez une classe pour une interface.

Si une méthode commence par get, considérez cela comme un getter et analysez la méthode pour extraire le nom de la variable et son type. Créez également un constructeur pour ces champs et implémentez également les méthodes equals, hashcode et toString.

Vous pouvez faire l'analyse de fichiers normale ou peut-être la réflexion peut également aider à ne pas être sûr.

0

en plus d'utiliser un IDE Java moderne qui vous aide à boilerplate de codage, vous pouvez également vérifier à l'aide d'un dynamic Proxy

1

Si vous allez faire énormément, alors vous voudrez peut-être envisager la fonction du processeur d'annotation intégré dans javac (apt retour dans Java SE 1.5).

Questions connexes