Comment implémenteriez-vous cette méthode: entrée d'échantillon (): p> sortie d'échantillon: p> false
false
true
true
3 Réponses :
n'est pas le La nervure est égale à pour Annotation Code> Travail? Peut-être que je ne comprends pas votre question. P>
Pourriez-vous s'il vous plaît me montrer comment remplaceriez-vous égale code> sur la classe d'annotation (prenons
@Sample code> annotation comme point de départ;
est égal à code> 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 code> est ailleurs mais pas à l'intérieur
annotation code> classe).
Si vous souhaitez vérifier si A1 et A2 sont la même annotation. Essaye ça: A1.AnnotationType (). Equals (A2.AnnotationType ()) P>
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> 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;
}
}
a1.equals (A2); code> 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.