6
votes

Comment vérifier l'égalité des annotations?

Comment implémenteriez-vous cette méthode: xxx pré>

entrée d'échantillon (): p> xxx pré>

sortie d'échantillon: p>

false
false
true
true


1 commentaires

a1.equals (A2); fonctionnera. Il s'agit du comportement par défaut des annotations - il vérifie que les annotations sont du même type et que chacun des champs d'annotation est égal. Aucun travail spécial requis.


3 Réponses :


2
votes

n'est pas le La nervure est égale à pour Annotation Travail? Peut-être que je ne comprends pas votre question.


3 commentaires

Pourriez-vous s'il vous plaît me montrer comment remplaceriez-vous égale sur la classe d'annotation (prenons @Sample annotation comme point de départ; est égal à vraiment compte, montrez-vous simplement où l'écririez-vous). Merci.


C'est déjà en Java pour les annotations. La valeur par défaut ne fonctionne-t-elle pas? Avez-vous regardé le lien que j'ai fourni? Peut-être qu'il y a un malentendu ...


Peut-être que vous avez raison, je vais enquêter (il n'est tout simplement pas évident que cela fonctionne depuis que le est égal à la mise en œuvre est ailleurs mais pas à l'intérieur annotation classe).



1
votes

Si vous souhaitez vérifier si A1 et A2 sont la même annotation. Essaye ça: A1.AnnotationType (). Equals (A2.AnnotationType ())


0 commentaires

0
votes

La partie ennuyeuse de ma réponse est que je ne peux pas prolonger une annotation personnalisée (dans le sens de l'héritage). Cela aurait simplifié la méthode des égaux.

premier.java p> xxx pré>

second.java p>

public class Example {


    public static void main(String[] args) throws NoSuchFieldException {
        String [][] fieldNameOfCases = {
                {"leftSideCase1","rightSideCase1"},
                {"leftSideCase2","rightSideCase2"},
                {"leftSideCase3","rightSideCase3"},
                {"leftSideCase4","rightSideCase4"},
        };

        // Loop through the list of field names, paired up by test case
        // Note: It's the construction of Thing1 that matches your question's
        // "sample input():"
        for(int index=0; index < fieldNameOfCases.length; index++) {
            Annotation leftSideAnnotation = getAnnotation(Thing1.class, fieldNameOfCases[index][0]);
            Annotation rightSideAnnotation = getAnnotation(Thing1.class, fieldNameOfCases[index][1]);
            System.out.println(equal(leftSideAnnotation, rightSideAnnotation));
        }
    }

    private static Annotation getAnnotation(Class<Thing1> thing1Class, String fieldName) throws NoSuchFieldException {
        Field classMemberField = Thing1.class.getDeclaredField(fieldName);
        Annotation[] annotations = classMemberField.getAnnotations();
        // ASSUME ONE ANNOTATION PER FIELD
        return annotations[0];
    }

    // This is my solution to the question
    public static boolean equal(Annotation a1, Annotation a2) {
       if(a1.getClass() != a2.getClass()) {
           return false;
       }
       if(a1 instanceof First) {
           if( ((First)a1).name().equals(((First)a2).name())  &&
               ((First)a1).value().equals(((First)a2).value()) ) {
               return true;
           }
           return false;
       }
       // Its annoying we can't leverage inheritance with the custom annotation
       // to remove duplicate code!! 
       if(a1 instanceof Second) {
            if( ((Second)a1).name().equals(((Second)a2).name())  &&
                ((Second)a1).value().equals(((Second)a2).value()) ) {
                return true;
            }
            return false;
        }
        return false;
    }
}


0 commentaires