Java에서 기능을 작성합니까?
-
18-09-2019 - |
문제
나는 우리가 만든 API에 대한 데모 코드를 작성하고 있으며 광고 구역에서 나 자신을 반복하는 것과 같은 문제에 대해 계속 진행하고 있습니다. 나는 Java가 폐쇄를 추가 할 예정이라는 것을 고통스럽게 알고 있지만 지금은 액세스 할 수 없습니다. 여기에 자신의 작은 구석에 박스를 넣고 싶은 곳에서 반복되는 내용은 다음과 같습니다.
public BarObj Foo(Double..._input){
try{
//things that vary per function
//but everything else...
} catch(NullException _null){
m_Logger.error("Null error exception caught in Blah::Foo");
return null;
} catch(Exception ex){
m_Logger.error( ex.getMessage() );
return null;
}
}
내가 이것을 돌아 다니는 유일한 방법은 Method
트러블 캐치 로직을 수행하는 함수로서 다른 기능으로 모든 것을 마무리합니다.
public BarObj MyFunc(Double..._input){
return compose("MyLogic",_input);
}
private BarObj MyLogic(Double..._input)
throws Exception{
//stuff
}
그러나 그것은 추악 해 보이고 많은 보일러 플레이트를 가지고 있습니다. Java에서 기능을 구성하는 더 쉬운 방법이 있습니까?
해결책
Java에서는 기능에 대한 일류 지원이 없기 때문에 이것은 매우 어렵습니다 (Clojure 또는 Scala와 달리).
그러나 할 수 있습니다 캡슐화 객체의 작업 :
interface Function<R, T> {
R call(T... input);
}
그런 다음 Refactor Foo
처럼:
static <R, T> R runFunction(Function<R, T> function, T ... input){
try{
return function.call(input);
} catch(NullPointerException _null){
m_Logger.error("Null error exception caught in Blah::Foo");
return null;
} catch(Exception ex){
m_Logger.error( ex.getMessage() );
return null;
}
}
테스트 케이스 :
class SumDoubles implements Function<Double, Double> {
@Override
public Double call(Double... input) {
Double sum = 0.0;
for (Double d : input) {
sum += d;
}
return sum;
}
}
@Test
public void sum() {
Double sum = runFunction(new SumDoubles(), 1.0, 2.0, 3.0);
assertThat(sum, is(6.0));
}
다른 팁
이것은 분명히 당신의 통화이지만, 내가 사용한 대부분의 API 데모에서 나는 당신이 상단에있는 더 긴 형식을 선호합니다. 코드를 살펴본 후에는 일반적으로 API 작업을 확인하기 위해 복사 및 붙여 넣기를 수행하여 여기에서 수정한다고 생각합니다. 반복적 인 작품 중 일부를 숨기려는 형식을 변경하는 것은 확실히 OO 개발을 위해하고 싶은 일이지만, 이런 데모 코드는 '청정 코드 신'이 이해할 수있는 것입니다 :-).
Java에서는이 작업을 수행 할 방법이 없지만 가능하다면 Groovy를 사용해보십시오. 비슷한 랩핑을 가질 수있는 다른 옵션은 측면을 사용하는 것입니다. 보다 종자.
Java에서 수행되는 방식은 하나의 방법이있는 인터페이스를 만드는 것입니다. 코드에서 해당 인터페이스를 구현하는 클래스를 사용합니다.