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

Line poem = { "foo", "bar" , "baz"}; is giving compilation error.

Any specific reason why this is not allowed? How do I initialize a String array with array constants?

EDIT: Thank you folks for your answers. Now I'm clear what is allowed and what is NOT. But can I ask you why this is NOT allowed?

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

After googling a bit, I found this link, where in, it is told that coding like this leaves the compiler in ambiguity - whether the pets should be array of Strings or array of Objects. However from the declaration, it can very well figure out that it is a String array, right???

jai
  • 21,519
  • 31
  • 89
  • 120
  • 2
    If those are constants, then `poem` shouldn't be initialized in constructor. – True Soft Jun 20 '10 at 06:57
  • @True Soft: I was just trying to 'initialize' the object state with some constants. Agree. If poem is declared as STATIC, private static String[] poem = { "foo", "bar" , "baz"}; it is working fine. – jai Jun 20 '10 at 07:11
  • @HanuAthena, it doesn't matter whether the member is `static` or not, the problem here is that array initializer is allowed only in a declaration (§8.3, §9.3, §14.4), or as part of an array creation expression (§15.10). Therefore, without `static` it also will work `private String[] poem = { "foo", "bar" , "baz"};` if you do this on the spot – Andrew Tobilko Aug 19 '16 at 07:29
  • Possible duplicate of [How to initialize an array in Java?](https://stackoverflow.com/questions/1938101/how-to-initialize-an-array-in-java) – Ivar Aug 05 '19 at 09:19

3 Answers3

65

This will do what you're looking for:

public Sonnet29() {
    poem = new String[] { "foo", "bar", "baz" };
}

Initialization lists are only allowed when creating a new instance of the array.

ZoogieZork
  • 11,215
  • 5
  • 45
  • 42
17

From the Java language specification:

An array initializer may be specified in a declaration, or as part of an array creation expression (§15.10), creating an array and providing some initial values

In short, this is legal code:

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

and this is illegal:

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
Andreas Dolk
  • 113,398
  • 19
  • 180
  • 268
5
{"cat", "dog"}

Is not an array, it is an array initializer.

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

This can be seen as an array 'constructor' with two arguments. The short form is just there to reduce RSI.

They could have given real meaning to {"cat", "dog"}, so you could say things like

{"cat", "dog"}.length

But why should they make the compiler even harder to write, without adding anything useful? (ZoogieZork answer can be used easily)

Ishtar
  • 11,542
  • 1
  • 25
  • 31