2010-06-20 6 views
40
public class Sonnet29 implements Poem { 
    private String[] poem; 
    public Sonnet29() { 
     poem = { "foo", "bar" , "baz"}; 
    } 
    @Override 
    public void recite() { 
     //... 
    } 
} 

La ligne poem = { "foo", "bar" , "baz"}; génère une erreur de compilation.Obtention d'une erreur de compilation lors de l'utilisation de constantes de groupe dans le constructeur

Une raison spécifique pour laquelle ceci n'est pas autorisé? Comment initialiser un tableau de chaînes avec des constantes de tableau?

EDIT: Merci à tous pour vos réponses. Maintenant, je suis clair ce qui est permis et ce qui ne l'est pas. Mais puis-je vous demander pourquoi ce n'est pas autorisé?

String[] pets; 
pets = {"cat", "dog"}; 

Après googler un peu, j'ai trouvé ce link, où, en, il est dit que le codage comme celui-ci quitte le compilateur dans l'ambiguïté - si les animaux doivent être tableau de chaînes ou tableau d'objets. Cependant, à partir de la déclaration, il peut très bien comprendre que c'est un tableau de chaînes, non?

+2

Si ce sont des constantes, alors 'poem' ne devrait pas être initialisé dans le constructeur. –

+0

@True Soft: J'essayais juste d '«initialiser» l'état de l'objet avec quelques constantes. Se mettre d'accord. Si le poème est déclaré comme STATIC, private static String [] poem = {"foo", "bar", "baz"}; ça fonctionne bien. – HanuAthena

+0

@HanuAthena, peu importe que le membre soit 'static' ou non, le problème ici est que l'initialiseur de tableau n'est autorisé que dans une déclaration (§8.3, §9.3, §14.4), ou dans le cadre d'une création de tableau expression (§15.10). Par conséquent, sans static, il fonctionnera aussi private string [] poem = {"foo", "bar", "baz"}; 'si vous le faites sur place – Andrew

Répondre

65

Cela fera ce que vous cherchez:

listes d'initialisation ne sont autorisées que lors de la création d'une nouvelle instance du tableau.

17

De l'Java language specification:

un initialiseur de réseau peut être spécifiée dans une déclaration, ou dans le cadre d'une expression de création de tableau (§15.10), la création d'un réseau et à fournir des valeurs initiales

En bref, ce code est légal:

private int[] values1 = new int[]{1,2,3,4}; 
private int[] values2 = {1,2,3,4}; // short form is allowed only (!) here 

private String[][] map1 = new String[][]{{"1","one"},{"2","two"}}; 
private String[][] map2 = {{"1","one"},{"2","two"}}; // short form 

List<String> list = Arrays.asList(new String[]{"cat","dog","mouse"}); 

et ce qui est illégal:

private int[] values = new int[4]; 
values = {1,2,3,4}; // not an array initializer -> compile error 

List<String> list = Arrays.asList({"cat","dog","mouse"}); // 'short' form not allowed 
5
{"cat", "dog"} 

est pas un tableau, il est un initialiseur de tableau. Cela peut être vu comme un «constructeur» de tableau avec deux arguments. La forme courte est juste là pour réduire les RSI.

On aurait pu donner un sens réel à { « chat », « chien »}, donc on peut dire des choses comme

{"cat", "dog"}.length 

Mais pourquoi devraient-ils rendre le compilateur encore plus difficile à écrire, sans ajouter quoi que ce soit utile ? (La réponse de ZoogieZork peut être utilisée facilement)

Questions connexes