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

La línea poem = { "foo", "bar" , "baz"}; está dando error de compilación.Obteniendo error en el compilador al usar constantes de matriz en el constructor

¿Alguna razón específica por la que esto no está permitido? ¿Cómo inicializo una matriz de cadenas con constantes de matriz?

EDIT: Gracias amigos por sus respuestas. Ahora estoy claro lo que está permitido y lo que NO. ¿Pero puedo preguntarle por qué esto NO está permitido?

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

Tras Google un poco, he encontrado este link, donde adentro, se dice que la codificación de esta manera deja el compilador en la ambigüedad - si los animales deben ser array de Strings o una matriz de objetos. Sin embargo, a partir de la declaración, puede muy bien darse cuenta de que es una matriz de Cadenas, ¿verdad?

+2

Si son constantes, entonces 'poema' no se debe inicializar en el constructor. –

+0

@True Soft: Estaba tratando de 'inicializar' el estado del objeto con algunas constantes. De acuerdo. Si el poema se declara como ESTÁTICO, private static String [] poema = {"foo", "bar", "baz"}; está funcionando bien – HanuAthena

+0

@HanuAthena, no importa si el miembro es 'estático' o no, el problema aquí es que el inicializador de matriz está permitido solo en una declaración (§8.3, §9.3, §14.4), o como parte de una creación de matriz expresión (§15.10). Por lo tanto, sin 'static' también funcionará' private String [] poema = {"foo", "bar", "baz"}; 'si haces esto en el acto – Andrew

Respuesta

65

Esto hará lo que usted está buscando:

listas de inicialización sólo se les permite al crear una nueva instancia de la matriz.

17

Desde el Java language specification:

un inicializador array puede especificarse en una declaración, o como parte de una expresión de creación de matriz (§15.10), creando una matriz y proporcionar algunos valores iniciales

En resumen, este es el código legal:

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

y esto es ilegal:

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

no es una matriz, es un inicializador de matriz.

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

Esto se puede ver como una matriz 'constructor' con dos argumentos. La forma corta está ahí para reducir el RSI.

Podrían haber dado un significado real a { "gato", "perro"}, por lo que podían decir cosas como

{"cat", "dog"}.length 

Pero ¿por qué deberían hacer que el compilador aún más difícil de escribir, sin añadir nada útil ? (La respuesta de ZoogieZork se puede usar fácilmente)

Cuestiones relacionadas