Почему необязательно Java 8 не следует использовать в аргументахJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему необязательно Java 8 не следует использовать в аргументах

Сообщение Anonymous »

Я читал на многих веб-сайтах. Необязательное значение следует использовать только как тип возвращаемого значения, а не в аргументах метода. Я изо всех сил пытаюсь найти логическую причину. Например, у меня есть часть логики, которая имеет два необязательных параметра. Поэтому я думаю, что имело бы смысл написать мою сигнатуру метода следующим образом (решение 1):

Код: Выделить всё

public int calculateSomething(Optional p1, Optional p2) {
// my logic
}
На многих веб-страницах указано, что необязательное значение не следует использовать в качестве аргументов метода. Имея это в виду, я мог бы использовать следующую сигнатуру метода и добавить четкий комментарий Javadoc, чтобы указать, что аргументы могут быть нулевыми, надеясь, что будущие сопровождающие прочитают Javadoc и, следовательно, всегда будут выполнять проверки на ноль перед использованием аргументов (решение 2). :

Код: Выделить всё

public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
В качестве альтернативы я мог бы заменить свой метод четырьмя общедоступными методами, чтобы обеспечить более приятный интерфейс и сделать его более очевидным. p1 и p2 являются необязательными (решение 3):

Код: Выделить всё

public int calculateSomething() {
calculateSomething(null, null);
}

public int calculateSomething(String p1) {
calculateSomething(p1, null);
}

public int calculateSomething(BigDecimal p2) {
calculateSomething(null, p2);
}

public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
Теперь я пытаюсь написать код класса, который вызывает эту часть логики для каждого подхода. Сначала я извлекаю два входных параметра из другого объекта, который возвращает необязательные, а затем вызываю CalculateSomething. Следовательно, если используется решение 1, вызывающий код будет выглядеть следующим образом:

Код: Выделить всё

Optional p1 = otherObject.getP1();
Optional p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
если используется решение 2, вызывающий код будет выглядеть следующим образом:

Код: Выделить всё

Optional p1 = otherObject.getP1();
Optional p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
если применяется решение 3, я мог бы использовать приведенный выше код или следующий (но это значительно больше кода):

Код: Выделить всё

Optional p1 = otherObject.getP1();
Optional p2 = otherObject.getP2();
int result;
if (p1.isPresent()) {
if (p2.isPresent()) {
result = myObject.calculateSomething(p1, p2);
} else {
result = myObject.calculateSomething(p1);
}
} else {
if (p2.isPresent()) {
result = myObject.calculateSomething(p2);
} else {
result = myObject.calculateSomething();
}
}
Итак, мой вопрос: почему считается плохой практикой использовать необязательные в качестве аргументов метода (см. решение 1)? Похоже, для меня наиболее читаемое решение, и оно делает наиболее очевидным, что параметры могут быть пустыми/нулевыми для будущих сопровождающих. (Я знаю, что разработчики необязательного планировали использовать его только как тип возвращаемого значения, но я не могу найти никаких логических причин не использовать его в этом сценарии).

Подробнее здесь: https://stackoverflow.com/questions/319 ... -arguments
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»