2010-07-01 9 views
0

J'ai plusieurs classes comme dans l'exemple suivant:plugin Eclipse pour la génération de code

abstract class AClass { 
    boolean validate(){ 
    return true; 
    } 
} 

Lorsqu'une autre classe étend AClass, je fais comme ça:

class BClass extends AClass { 
    @Override 
    boolean validate() { 
    if (!super.validate()) { 
     return false; 
    } 
    // TODO validate 
    return true; 
    } 
} 

Y at-il un plugin Eclipse génère ce code pour moi lorsque je crée une nouvelle classe à partir du menu (Fichier> Nouveau> Classe)?
Je pense à utiliser une annotation

@Target(ElementType.METHOD) 
@interface Code { 
    String content(); 
} 

et l'ajouter à la méthode:

abstract class AClass { 
    @Code(content = "\tif (!super.validate()) {\r\n" 
     + "\t\treturn false;\r\n" 
     + "\t}\r\n" 
     + "\t// TODO validate\r\n" 
     + "\treturn true;") 
    boolean validate() { 
     return true; 
    } 
} 

Le plugin doit rechercher l'annotation et générer le code dans la classe nouvellement créée. Sous Windows -> Préférences, vous pouvez entrer des modèles de code Java.

+1

Je pense que la vraie question ici est pourquoi vous devez implémenter la même méthode encore et encore –

+0

@matt Dans la classe étendue, // TODO validate' sera remplacé par du code qui valide les nouveaux champs ajoutés par cette classe. –

+0

alors faites 'validate()' final, et faites une nouvelle méthode abstraite 'doValidate()'? –

Répondre

0

Une solution à ma demande serait la suivante:

Créer dans un plugin autre « Assistant de classe », en étendant org.eclipse.jdt.internal.ui.wizards.NewElementWizard (similaire à la NewClassCreationWizard classe) avec une page qui s'étend org.eclipse.jdt.ui.wizards.NewTypeWizardPage (comme NewClassWizardPage)

Override org.eclipse.jdt.ui.wizards.NewTypeWizardPage.createTypeMembers(IType, ImportsManager, IProgressMonitor)

Tout d'abord, appeler à createInheritedMethods (comme dans NewClassWizardPage)

Ensuite, type.getMethods() vous donnera les méthodes héritées de la superclasse.

Vérifiez si une méthode de la matrice résultante a l'annotation souhaitée dans la superclasse (par exemple, @Code). Dans le cas contraire, créez le nouveau code de la méthode, y compris la déclaration de ce:

StringBuffer buf = new StringBuffer(); 
buf.append("@Override").append("\n"); 
buf.append(Modifier.toString(Modifier.PUBLIC) + " "); 
buf.append(Signature.toString(method.getSignature(), method.getElementName(), method.getParameterNames(), false, true)); 
buf.append(" {").append("\n"); 
buf.append("// the code from the annotation\n"); 
buf.append("}"); 

Supprimer la méthode actuelle:

method.delete(true, monitor); 

Ensuite, ajoutez la méthode avec le code personnalisé:

type.createMethod(buf.toString(), null, true, monitor); 

maintenant installez le plugin, et lorsque vous créez une nouvelle classe avec l'assistant, le code personnalisé pour les méthodes sera automatiquement écrit là.

0

Vous trouverez des modèles de code sous Java -> Style Code -> Modèles de code

sur Eclipse 3.5, le modèle pour le corps de classe est vide. Vous pouvez ajouter votre propre motif.

Voici le modèle des nouveaux fichiers Java, pour vous donner une idée de ce à quoi ressemble un motif.

${filecomment} 
${package_declaration} 

${typecomment} 
${type_declaration} 
+0

Je veux que le code généré soit pour * certaines * méthodes seulement, pas pour * toutes les méthodes *. –