Доступ к конструктору анонимного класса

    mysql> set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    mysql> exit;
212
задан Michael Myers 30 June 2009 в 04:59
поделиться

5 ответов

От Спецификация языка Java, разделите 15.9.5.1:

анонимный класс не может иметь явно заявленного конструктора.

Извините: (

РЕДАКТИРОВАНИЕ: Как альтернатива, можно создать некоторые заключительные локальные переменные и/или включать инициализатор экземпляра в анонимный класс. Например:

public class Test {
    public static void main(String[] args) throws Exception {
        final int fakeConstructorArg = 10;

        Object a = new Object() {
            {
                System.out.println("arg = " + fakeConstructorArg);
            }
        };
    }
}

Это безобразно, но это могло бы просто помочь Вам. С другой стороны, используйте надлежащий вложенный класс:)

272
ответ дан Yasin Okumuş 23 November 2019 в 04:30
поделиться

Это не возможно, но можно добавить анонимный инициализатор как это:

final int anInt = ...;
Object a = new Class1()
{
  {
    System.out.println(anInt);
  }

  void someNewMethod() {
  }
};

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

96
ответ дан Arne Burmeister 23 November 2019 в 04:30
поделиться

Не имеет никакого смысла иметь именованного перегруженного конструктора в анонимном классе, поскольку не было бы никакого способа назвать его, так или иначе.

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

1
ответ дан Ilja Preuß 23 November 2019 в 04:30
поделиться

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

2
ответ дан 23 November 2019 в 04:30
поделиться

Вот еще один способ по поводу проблемы:

public class Test{

    public static final void main(String...args){

        new Thread(){

            private String message = null;

            Thread initialise(String message){

                this.message = message;
                return this;
            }

            public void run(){
                System.out.println(message);
            }
        }.initialise(args[0]).start();
    }
}
72
ответ дан 23 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

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