Java 8은 기능적 인터페이스 개념과 기능적 인터페이스 를 취하도록 설계된 수많은 새로운 메소드를 추가했습니다. 이러한 인터페이스의 인스턴스는 메소드 참조 표현식 (예 :)SomeClass::someMethod
및 람다 표현식 (예 :)을 사용하여 간결하게 작성할 수 있습니다 (x, y) -> x + y
.
동료와 나는 어떤 형태를 사용하는 것이 가장 좋은지에 대해 다른 의견을 가지고 있습니다 (이 경우 "최상의"는 기본적으로 그렇지 않기 때문에 "가장 읽기 쉬운"상태로, "가장 표준적인 사례와 일치"합니다) 동등한). 특히 다음과 같은 경우에 해당합니다.
- 해당 함수는 단일 범위 밖에서 사용되지 않습니다
- 인스턴스에 이름을 지정하면 가독성에 도움이됩니다 (예를 들어 로직이 한 눈에 발생하는 것을 볼 수있을 정도로 단순함)
- 한 형태가 다른 형태보다 선호되는 다른 프로그래밍 이유는 없습니다.
이 문제에 대한 나의 의견은 개인 메소드를 추가하고 메소드 참조로 참조하는 것이 더 나은 접근법이라는 것입니다. 이것이 기능이 사용되도록 설계된 방식과 같은 느낌이 들며 메소드 이름과 서명을 통해 진행중인 내용을 쉽게 전달할 수 있습니다 (예 : "boolean isResultInFuture (Result result)"). 또한 클래스에 대한 향후 개선이 동일한 검사를 사용하려고하지만 기능적 인터페이스 랩퍼가 필요하지 않은 경우 개인 메소드를 더 재사용 가능하게 만듭니다.
동료의 선호는 인터페이스의 인스턴스를 반환하는 메소드 (예 : "Predicate resultInFuture ()")를 갖는 것입니다. 나에게 이것은 기능이 의도 된 방식이 아니고 약간 어색한 느낌이 들며 실제로 이름을 통해 의도를 전달하는 것이 더 어려워 보입니다.
이 예제를 구체적으로 만들기 위해 다른 스타일로 작성된 동일한 코드가 있습니다.
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(this::isResultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
private boolean isResultInFuture(Result result) {
someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
vs.
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
results.filter(resultInFuture()).forEach({ result ->
// Do something important with each future result line
});
}
private Predicate<Result> resultInFuture() {
return result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
}
}
vs.
public class ResultProcessor {
public void doSomethingImportant(List<Result> results) {
Predicate<Result> resultInFuture = result -> someOtherService.getResultDateFromDatabase(result).after(new Date());
results.filter(resultInFuture).forEach({ result ->
// Do something important with each future result line
});
}
}
한 가지 접근 방식이 더 선호되는지, 언어 설계자의 의도에 더 부합하는지 또는 더 읽기 쉬운 지에 대한 공식 또는 준공식 문서 또는 의견이 있습니까? 공식 소스를 제외하고 더 나은 접근 방식이 필요한 명확한 이유가 있습니까?
Object::toString
. 그래서 내 질문은 내가 여기에 배치하고있는이 특정 유형의 인스턴스에서 더 나은지 여부에 대한 것입니다.