2017-09-17 8 views
0

En savoir plus sur How to set String Array in Java Annotationparamètre Annotation - String [] paramètre de type jeu à chaîne littérale

J'ai une requête, pour le code ci-dessous:

@Unfinished("Just articleware") 
public @interface Unfinished { 
    public enum Priority {LOW, MEDIUM, HIGH} 
    String value(); 
    String[] owners() default ""; 
    Priority priority() default Priority.MEDIUM; 
} 

attendant une syntaxe String[] owners() default {}. Comment le compilateur Java permet la syntaxe littérale de chaîne ("") pour le paramètre de type String[] (owners)?

+1

Les deux versions sont acceptables. 'default" "' est comme 'default {" "}' donc la valeur par défaut est array avec * un * element: chaîne vide. Si vous définissez 'default {}', la valeur par défaut est * empty * array. – Pshemo

+0

Le tableau avec une chaîne vide. Vous pouvez également mettre une seule chaîne "default" là aussi bien ou '{}' simplement pour un tableau vide. – nullpointer

Répondre

1

Comme indiqué dans les commentaires, la valeur par défaut "" pour la clé d'annotation owners crée un tableau avec un élément qui est une chaîne vide. Vous pouvez également mettre une seule chaîne "default" là aussi qui conduirait à la création d'un tableau avec seule valeur « default »

OU

{} simplement un tableau vide si le besoin est.


Pour tester cela, vous pouvez marquer l'annotation à la politique de rétention Runtime:

@Unfinished("Just articleware") 
@Retention(RetentionPolicy.RUNTIME) // mark with Runtime retention policy 
public @interface Unfinished { 
    enum Priority {LOW, MEDIUM, HIGH} 

    String value(); 

    String[] owners() default ""; 

    Priority priority() default Priority.MEDIUM; 
} 

annoter une classe avec cette

@Unfinished(value = "") 
public class AnnotatedClass { 

    public static void main(String[] args) { 
     System.out.println(""); 
    } 
} 

et ensuite utiliser la réflexion pour obtenir les valeurs de la les clés de Unfinished comme:

public static void main(String[] args) throws Exception { 
    System.out.println("Testing..."); 
    Class<AnnotatedClass> obj = AnnotatedClass.class; 
    if (obj.isAnnotationPresent(Unfinished.class)) { 
     Annotation annotation = obj.getAnnotation(Unfinished.class); 
     Unfinished unfinished = (Unfinished) annotation; 
     System.out.println(Arrays.toString(unfinished.owners())); 
    } 
}