Я читал на многих веб-сайтах. Необязательное значение следует использовать только как тип возвращаемого значения, а не в аргументах метода. Я изо всех сил пытаюсь найти логическую причину. Например, у меня есть часть логики, которая имеет два необязательных параметра. Поэтому я думаю, что имело бы смысл написать мою сигнатуру метода следующим образом (решение 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