Очевидно, что это сводится к стилю, поэтому нет жестких правил, которые говорят нам, какая версия является «лучшей». Если весь код, который ваша команда пишет, следует схеме 1, то это лучший код для вас.
Сказав это, я предпочитаю простую начальную защиту, за которой следует код, вычисляющий «реальный» результат, например:
if (in == null)
return null;
DTOIntIdentityDocument out = new DTOIntIdentityDocument();
out.setDocumentType(this.mapDocumentTypeÇ(in.getDocumenttype()));
out.setDocumentNumber(in.getDocumentnumber());
return out;
Вы хотите написать код, который легко читать и понимать. В вашей версии один блок else ... который на самом деле не обязательно должен быть в своем собственном блоке с дополнительными отступами. С другой стороны, ваш второй фрагмент использует три разных уровня абстракции: простое присваивание, блок if, простое возвращение. Это определенно «сложнее», чем вариант 1 или модифицированный код, который я использовал выше. Но обратите внимание: у варианта 2 тоже есть свои преимущества. Если вы хотите / должны отслеживать / регистрировать результат этого метода, с опцией 2, вы добавляете один trace(out)
прямо перед оператором return.
И для справки: когда вы используете «хардкорный» чистый код, метод, наконец, будет выглядеть так:
if (in == null)
return null;
return createDocumentFrom(in);
или что-то похожее. Значение: вы помещаете тот код, который фактически создает и настраивает результирующий объект в его собственный закрытый метод. И этому методу не нужно беспокоиться о передаче нулевого параметра!
Наконец: идеальное решение не должно беспокоиться о нулевых параметрах. Просто потому, что вы избегаете нуля, как чума. Не всегда возможно, но всегда желательно!