Вы используете здесь то, что будет обозначаться как двойной инициализации распорки. В принципе, это создает анонимный класс с инициализатором, который выполняет некоторую обработку, например добавление данных в список.
Написанное с добавлением разрывов строк, это то, что это на самом деле выглядит следующим образом:
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
или какой-либо другой реализации списка, чтобы вам не пришлось переопределять какие-либо методы. Во-вторых, вы не хотите печатать содержимое переменной внутри инициализатора, но вне его. В-третьих, и, вероятно, самое главное: вы не хотите использовать инициализацию двойной скобки вообще!
Вы, вероятно, не может сделать 'System.out.println' внутри декларации - вы можете сделать это в статическом блоке инициализации, хоть. (Но метод инициализации с двойной привязкой - это грязный хак, который вам, вероятно, лучше избегать.) –
Он не компилируется. И он напечатает 'null', если вы его скомпилируете. Почему вы хотите знать, как эта работа не работает? – zapl
[Что такое инициализация Double Brace в Java] (http://stackoverflow.com/questions/1958636/what-is-double-brace-initialization-in-java)? – Perdomoff