많은 웹 사이트에서 읽었습니다. Optional은 반환 유형으로 만 사용해야하며 메서드 인수에는 사용하지 않아야합니다. 나는 논리적 인 이유를 찾기 위해 고심하고 있습니다. 예를 들어 2 개의 선택적 매개 변수가있는 논리가 있습니다. 따라서 다음과 같이 메서드 서명을 작성하는 것이 좋습니다 (솔루션 1).
public int calculateSomething(Optional<String> p1, Optional<BigDecimal> p2 {
// my logic
}
많은 웹 페이지는 Optional을 메소드 인수로 사용해서는 안된다고 지정합니다. 이를 염두에두고 다음 메소드 서명을 사용하고 명확한 Javadoc 주석을 추가하여 인수가 null 일 수 있음을 지정하면 향후 관리자가 Javadoc을 읽고 인수를 사용하기 전에 항상 null 검사를 수행하기를 희망합니다 (솔루션 2) :
public int calculateSomething(String p1, BigDecimal p2) {
// my logic
}
또는 더 나은 인터페이스를 제공하고 p1과 p2가 선택 사항이되도록 분명하게하기 위해 메서드를 4 개의 공용 메서드로 대체 할 수 있습니다 (솔루션 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
}
이제 각 접근 방식 마다이 논리를 호출하는 클래스 코드를 작성하려고합니다. 먼저 Optional
s 를 반환하는 다른 객체에서 두 개의 입력 매개 변수를 검색 한 다음 invoke calculateSomething
합니다. 따라서 솔루션 1을 사용하면 호출 코드는 다음과 같습니다.
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1, p2);
솔루션 2를 사용하는 경우 호출 코드는 다음과 같습니다.
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> p2 = otherObject.getP2();
int result = myObject.calculateSomething(p1.orElse(null), p2.orElse(null));
솔루션 3을 적용하면 위의 코드를 사용하거나 다음을 사용할 수 있습니다 (그러나 훨씬 더 많은 코드).
Optional<String> p1 = otherObject.getP1();
Optional<BigInteger> 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();
}
}
그래서 내 질문은 : 왜 Optional
메소드 인수로 s 를 사용하는 것이 나쁜 습관으로 간주 됩니까? 그것은 나에게 가장 읽기 쉬운 솔루션처럼 보이며 매개 변수가 미래 관리자에게 비어 있거나 null 일 수 있음을 가장 분명하게 만듭니다. (디자이너가 Optional
반환 유형으로 만 사용하도록 의도했지만이 시나리오에서 사용하지 않는 논리적 이유는 없습니다.)
null
.