Не удалось понять новое ключевое слово в java
Вероятно, очень важный вопрос
Я новичок в java и читаю стороннюю api, написанную в java...
Я наткнулся на это объявление
Foo foo = new FooBar().new Foo();
Я не могу понять
FooBar().new
Почему это объявление выглядит следующим образом?
Какие преимущества можно получить при объявлении чего-то подобного выше и в чем альтернативы такому объявлению.
Приветствуются любые рекомендации/ссылки.
спасибо
Ответы
Ответ 1
FooBar
содержит внутренний класс, подобный этому
class FooBar {
class Foo {
...
}
}
Для экземпляра внутреннего класса требуется новый экземпляр внешнего класса. Некоторые классы не имеют смысла сами по себе, поэтому реализуются как вложенные классы. Здесь Foo
имеет отношение с FooBar
, а также имеет доступ ко всем последним переменным-членам.
Ответ 2
Обратите внимание на ответ @Reimeus на ваш первый вопрос.
Что касается вашего второго вопроса:
какие альтернативы такому объявлению
Если внутренний класс может быть создан независимо от внешнего класса, вы можете сделать внутренний класс статическим, как в:
public class FooBar
{
// ...
public static class Foo
{
// ...
}
}
Затем вы создадите экземпляр с помощью:
new Foobar.Foo()
Классическое использование такого статического внутреннего класса - класс строителя для вашего класса (рецепт, извлеченный из Эффективная Java - купите эту книгу). Это хороший способ создания неизменяемых экземпляров, а также хороший пример "свободных интерфейсов", поскольку, как правило, все методы-конструкторы возвращают сам экземпляр компоновщика:
public class MyClass
{
public static Builder newBuilder()
{
return new Builder();
}
private MyClass(final Builder builder)
{
// build according to data in builder
}
public static class Builder
{
private Builder()
{
}
// methods to add data to builder, then:
public MyClass build()
{
return new MyClass(this);
}
}
}
Вы увидите статический метод factory newBuilder()
; это позволяет вам написать:
MyClass.newBuilder()
вместо
new MyClass.Builder()
чтобы создать конструктор.