2015-11-30 4 views
-2
private static final List<String> datas = new List<String>() {{ 
    add("aaaa"); 
    add("bbbb"); 
    System.out.println(datas); 
}}; 

Я объявил список и добавил некоторые данные. Затем я хочу распечатать данные, хранящиеся в этом списке. Но код не работает. Не могли бы вы объяснить, почему?Что не так с этим кодом Java

+5

Вы, вероятно, не может сделать 'System.out.println' внутри декларации - вы можете сделать это в статическом блоке инициализации, хоть. (Но метод инициализации с двойной привязкой - это грязный хак, который вам, вероятно, лучше избегать.) –

+0

Он не компилируется. И он напечатает 'null', если вы его скомпилируете. Почему вы хотите знать, как эта работа не работает? – zapl

+0

[Что такое инициализация Double Brace в Java] (http://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-in-java)? – Perdomoff

ответ

1

Вы используете здесь то, что будет обозначаться как двойной инициализации распорки. В принципе, это создает анонимный класс с инициализатором, который выполняет некоторую обработку, например добавление данных в список.

Написанное с добавлением разрывов строк, это то, что это на самом деле выглядит следующим образом:

private static final List<String> datas = new List<String>() { 

    { 
     // this is the initializer block 
     add("aaaa"); 
     add("bbbb"); 
     System.out.println(datas); 
    } 

    // huh? no methods of List are implemented here! 

}; 

Первая проблема заключается в том, что вы пытаетесь создать анонимный класс List, но вы не перекрывая какой-либо из его абстрактных методов , Это приводит к ошибке компиляции.

Вторая «проблема», является то, что System.out.println класс находится внутри инициализатора, но в этот момент, переменная datas является null, так что это будет напечатано (и это, вероятно, не то, что вы хотите).

Итак, во-первых, вы хотите создать анонимный класс, полученный из ArrayList или какой-либо другой реализации списка, чтобы вам не пришлось переопределять какие-либо методы. Во-вторых, вы не хотите печатать содержимое переменной внутри инициализатора, но вне его. В-третьих, и, вероятно, самое главное: вы не хотите использовать инициализацию двойной скобки вообще!

0

Вам необходимо реализовать методы интерфейса java.util.List. и ваш код не находится внутри метода или статического блока.

Я думаю, что легче

// Creating an empty array list 
    ArrayList<String> list = new ArrayList<String>(); 
    // Adding items to arrayList 
    list.add("Item1"); 
    list.add("Item2"); 
-1

Ваш код реализует интерфейс List как анонимный класс, поэтому вам нужно реализовать все методы List. Я думаю, что вы имели в виду статической инициализации списка, должно быть сделано, как:

private static final List<String> datas = new ArrayList<String>(); 
static{ 
    datas.add("aaaa"); 
    datas.add("bbbb"); 
    System.out.println(datas); 
}; 
+0

Возможно, вам захотелось написать 'static {}'. – Tunaki

+0

_Вы не можете печатать внутри статического блока. Это не то, что здесь происходит, но почему вы так думаете? –

Смежные вопросы