Не удалось понять новое ключевое слово в 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()

чтобы создать конструктор.