Как обрабатывать конструктор, инициализированный с нуля? - PullRequest
0 голосов
/ 28 октября 2018

Пусть будет класс A.Класс B выглядит следующим образом:

public class B {

    private int anInt;
    private String aString;
    ...

    public B(A initObj) {
       anInt = initObj.getIntField();
       aString = initObj.getStringField();
       ...
    }

    ...
}

Если initObj равен null, то наиболее разумно, чтобы объект B также был нулевым.Но, согласно Интернету , конструктор Java не может вернуть ноль.

Очевидно, что лучше всего проверить на стороне кода, который вызывает конструктор для B, чтобы не вызывать конструктор с нулевым аргументом.Но, предполагая, что такая возможность возникает, каков наилучший способ изящно справиться с этой ситуацией.

Каков наилучший способ справиться с ситуацией, когда B инициализируется с помощью null?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Один из способов сделать это - использовать Objects.requireNonNull(initObj) в вашем конструкторе.Это выдаст NullPointerException, если экземпляр A равен null.

public B(A initObj) {
    Objects.requireNonNull(initObj);
    anInt = initObj.getIntField();
    aString = initObj.getStringField();
}

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

public static Optional<B> createB(A initObj) {
    if (initObj == null)
        return Optional.empty();

    return Optional.of(new B(initObj));
}

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

0 голосов
/ 28 октября 2018

У вас есть несколько вариантов в зависимости от того, что вы хотите, чтобы произошло в вашем приложении.Вы могли бы изменить сигнатуру конструктора B, чтобы принимать параметры int и String вместо A. Таким образом, вызывающая сторона должна иметь дело с возможно нулевым initObj, а B не должен иметь дело с потенциально нулевыми аргументами в конструкторе.Конструктор может также выполнить нулевую проверку initObj и либо не инициализировать поля B, если это допустимое состояние для B, либо выдать исключение, если это действительно неверно.

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