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

La riga poem = { "foo", "bar" , "baz"}; genera errori di compilazione.Errore del compilatore durante l'utilizzo delle costanti di matrice nel costruttore

Qualsiasi motivo specifico per cui non è consentito? Come inizializzare un array di stringhe con costanti di array?

EDIT: Grazie gente per le vostre risposte. Ora sono chiaro cosa è permesso e cosa NON è. Ma posso chiederti perché questo NON è permesso?

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

Dopo googling un po ', ho trovato questo link, dove, si racconta che codifica come questo lascia il compilatore in ambiguità - se gli animali domestici devono essere array di stringhe o array di oggetti. Comunque dalla dichiarazione, può benissimo capire che si tratta di un array di stringhe, giusto ???

+2

Se queste sono costanti, quindi 'poem' non deve essere inizializzato nel costruttore. –

+0

@True Soft: stavo solo cercando di "inizializzare" lo stato dell'oggetto con alcune costanti. Essere d'accordo. Se la poesia è dichiarata come STATIC, string statico privato [] poem = {"foo", "bar", "baz"}; sta funzionando bene. – HanuAthena

+0

@HanuAthena, non importa se il membro è 'static' o no, il problema qui è che l'inizializzatore di array è permesso solo in una dichiarazione (§8.3, §9.3, §14.4), o come parte di una creazione di array espressione (§15.10). Pertanto, senza 'static' funzionerà anche' private String [] poem = {"foo", "bar", "baz"}; 'se lo fai sul posto – Andrew

risposta

65

Questo farà quello che stai cercando:

liste di inizializzazione sono ammessi solo quando si crea una nuova istanza della matrice.

17

Dal Java language specification:

Un inizializzatore matrice può essere specificata in una dichiarazione, o come parte di un'espressione creazione matrice (§15.10), creando un array e fornendo alcuni valori iniziali

In breve, questo è il codice legale:

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"}); 

e questo è illegale:

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"} 

non è un array, è un inizializzatore array.

new String[]{"cat", "dog"} 

Questo può essere visto come un "costruttore" dell'array con due argomenti. La forma abbreviata è proprio lì per ridurre l'RSI.

Potevano hanno dato un significato reale alla { "gatto", "cane"}, quindi si potrebbe dire le cose come

{"cat", "dog"}.length 

Ma perché dovrebbero rendere il compilatore ancora più difficile da scrivere, senza aggiungere nulla di utile ? (La risposta di ZoogieZork può essere facilmente utilizzata)

Problemi correlati