Создать объект, используя новые против - PullRequest
0 голосов
/ 23 января 2019

Во время реализации моей задачи я видел других разработчиков, которые создавали класс, используя @AllArgsConstructor(access = AccessLevel.PRIVATE), что делало конструктор класса закрытым.Затем они создают объект, используя вместо этого of.
В чем разница между созданием с использованием new и of?

A a = new A();
A a =  A.of();


@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
    public class A
    {
        @NonNull
        String data;

        public static A of() 
        {
            return new A();
        }

    }

1 Ответ

0 голосов
/ 23 января 2019

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

Одним (довольно глупым) примером будет класс Person, который может позволить указать только имя или фамилию. В этом случае следующие конструкторы не будут работать:

Person(String firstName, String lastName)

Person(String firstName)

Person(String lastName)

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

Использование статических фабричных методов позволяет называть методы там, где это необходимо:

Person of(String firstName, String lastName)

Person ofFirstName(String firstName)

Person ofLastName(String lastName)

Общее of используется, когда вам не нужно называть его. Он все еще может быть перегружен так же, как конструкторы могут быть перегружены, например, Вы также можете иметь:

Person of(String firstName, String lastName, int age)

Хотя метод фабрики используется не так часто, как обычно, он также может возвращать подкласс, если сочтет это необходимым.

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

До статического метода интерфейса JDK реализовал Arrays.asList(...) для создания списка явно заданных объектов. С введением в язык статических методов интерфейса этот метод теперь (также) реализован на самом интерфейсе List как List.of(...).

Кроме того, они также добавили удобные методы для Set.of(...) и Map.of(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...