Допустим вы хотите создать коллекцию с набором констант. Для этого в классе вы можете написать что-то типа:
private static final Set<String> SOME_CODES = new HashSet<String>();
static {
SOME_CODES.add("code1");
SOME_CODES.add("code2");
SOME_CODES.add("code3");
SOME_CODES.add("code4");
}
Довольно неуклюжая запись, неправда ли? К тому же наполнение контейнера вынесено за пределы его создания, что само по себе чревато ошибками. Тут-то на помощь нам и приходит double brace инициализация! Можно переписать это выражение так:
private static final Set<String> SOME_CODES = new HashSet<String>() {{
add("code1");
add("code2");
add("code3");
add("code4");
}};
Выглядит просто. Но что же тут произошло? Первая скобка создает анонимный внутренний класс (напомню, что анонимные внутренние классы можно создавать не только от интерфейсов, но и от классов), а вторая - блок инициализации, который вызывается на этапе инстанцирования класса. Внутри этого блока вы можете использовать любые методы и поля класса, помня о том, что блок статической инициализации выполняется ДО вызова конструктора класса (но после конструктора суперкласса).Стоит заметить, что инициализация double brace не работает для final-классов, т.к. для них мы не можем создать анонимный подкласс.
Все это довольно сложно на мой взгляд и заставляет лишний раз отвлекаться от решения более важных проблем. К счастью, для создания коллекции с набором констант, мы можем просто сделать так:
List<String> SOME_CODES = new ArrayList<String>(
Arrays.asList("code1", "code2", "code3", "code4"));
Всё просто, лаконично и очевидно. Так что, как говорится, KISS.
Блин, хотел написать "здесь был я", но протупил. А редактировать комменты оно не даёт. :(
ОтветитьУдалитьСпасибо за текст того первого коммента. Исправил. :)
УдалитьМожет тебе будет интересно: http://t.co/Kx7UPc1y
ОтветитьУдалитьЯ просмотрел по диагонали и понял, что всё еще хуже, чем я думал. А чтобы все было хотя бы более-менее приемлемо, надо проявлять нехилую сноровку.
List SOME_CODES = Arrays.asList("code1", "code2", "code3", "code4");
ОтветитьУдалитьпочему так не использовали? ^