Значение нового Класса (…) {{…}} идиома инициализации [дубликат]

Если ничто иное, можно сделать грязный взлом при помощи крон (планировщик задач Linux) для выдачи той команды периодически. Это не точно идеально все же.

https://help.ubuntu.com/community/CronHowto

44
задан Andrew Tobilko 1 June 2016 в 10:49
поделиться

3 ответа

Это называется инициализация двойной фигурной скобки . (РЕДАКТИРОВАТЬ: ссылка удалена, заархивировано здесь )

Это означает, что вы создаете анонимный подкласс, а код в двойных фигурных скобках в основном является конструктором. Его часто используют для добавления содержимого в коллекции, потому что синтаксис Java для создания того, что по сути является константами коллекции, несколько неудобен.

Так что вы можете сделать:

List<String> list = new ArrayList<String>() {{
  add("one");
  add("two");
  add("three");
}};

вместо:

List<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");

На самом деле мне это не нравится и я предпочитаю это делать this:

List<String> list = Arrays.asList("one", "two", "three");

В этом случае это не имеет особого смысла, тогда как, скажем, для Карт, у которых нет удобного помощника.

67
ответ дан 26 November 2019 в 22:03
поделиться

«Внешние» фигурные скобки означают, что вы создаете анонимный подкласс, вторые фигурные скобки являются инициализатором объекта. Инициализатор запускается перед конструктором класса, но после любых вызовов super (и, следовательно, также после любых инициализаторов суперкласса). Вы также можете использовать инициализаторы в неанонимных классах, что является удобным способом инициировать поля final , если у вас есть несколько конструкторов, которые не могут вызывать друг друга, или поля, требующие более сложной инициализации, чем позволяют обычные инициализаторы полей. .

Рассмотрим этот класс:

class X extends Y{
    private final int lulz;

    private static boolean someCondition(){...}
    private static boolean danger() throws SomeException { ... }
    public X(A a) throws SomeException {
        super(a); 
        lulz = someCondition()? danger() : 0;
    }
    public X(B b) throws SomeException {
        super(b); 
        lulz = someCondition()? danger() : 0;
    }
}

Его можно переписать как:

class X extends Y{
    private final int lulz;

    private static boolean someCondition(){...}
    private static boolean danger() throws SomeException { ... }
    { // initalizer -- might throw SomeException!
        lulz = someCondition()? danger() : 0;
    }
    public X(A a) throws SomeException { super(a); }
    public X(B b) throws SomeException { super(b); }
}

Если инициализатор может генерировать проверенное исключение, все конструкторы должны объявить, что они могут его генерировать.

12
ответ дан 26 November 2019 в 22:03
поделиться

Вы создаете анонимный класс и используете класс Instance initialize r идиому, например:

class X {
    private Y var1;

    private X() {
        Z context = new Z(
               new SystemThreadPool()) {
                   {                        // This is the initialize idiom
                       var1 = new Y();      //
                   }                        //
               }
          );  // BTW you are missing ")"
    }
}
4
ответ дан 26 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: