"new Foo() {}" vs. "new Foo()" в Java
например:
Object o1 = new ArrayList<String>();
Object o2 = new ArrayList<String>(){};
Object o3 = new ArrayList<String>(){{}};
какая разница?
Я не могу google из 2-го/3-го грамматика java, любой ссылки?
Ответы
Ответ 1
Первый создает ArrayList
Второй создает анонимный подкласс ArrayList, который имеет определенный общий тип String
Третий тот же, но у него есть блок инициализатора, который пуст.
Примечание. Когда это возможно, вы должны написать самый простой и понятный код, который вы можете использовать, если вы думаете о производительности.
Ответ 2
Object o1 = new ArrayList<String>();
Создает ArrayList.
Object o2 = new ArrayList<String>(){};
Здесь вы создаете анонимный класс, который расширяет ArrayList<String>
и не отменяет ничего. Так что разница в том, что вы подклассифицируете ArrayList без переопределения поведения, никогда не делайте этого, если у вас нет веской причины.
Object o3 = new ArrayList<String>(){{}};
Вы создаете то же самое, что и 2, но с пустым блоком инициализатора.
Ответ 3
Object o1 = new ArrayList<String>();
Создание нового объекта ArrayList и назначение его o1
Object o2 = new ArrayList<String>(){};
Создание нового экземпляра анонимного класса, который расширяет ArrayList и назначает его o2
Object o3 = new ArrayList<String>(){{}};
Создание нового экземпляра анонимного класса (отличного от o2
), который расширяет ArrayList, который имеет инициализатор экземпляра no-op.
Функционально классы анонов, назначенные o2
и o3
, эквивалентны, но технически они будут разными классами.
Ответ 4
Вы анонимно создаете экземпляр класса. Вы можете переопределить методы в последнем случае без необходимости определять новый класс в собственном файле.
Ответ 5
o3
по-прежнему является экземпляром анонимного подкласса ArrayList
, который имеет пустой блок инициализации экземпляра (внутренний {}
).
Ответ 6
// Instantiate an object of type `ArrayList<String>`
Object o1 = new ArrayList<String>();
// Instantiate an anonymous subclass of `ArrayList<String>`
Object o2 = new ArrayList<String>(){};
// Instantiate an anonymous subclass of `ArrayList<String>` with an empty initializer block
Object o3 = new ArrayList<String>(){{}};
Ответ 7
Object o2 = new ArrayList<String>(){};
это анонимный внутренний класс, который расширяет класс ArrayList
и ничего не отменяет.
Object o2 = new ArrayList<String>(){{}};
это также анонимный внутренний класс, который расширяет класс ArrayList
и не отменяет ничего, но имеет empty instance block
.