문제

나는 우리가 만든 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));
}

다른 팁

노력하다 람다 즈. 그것은 매우 가볍고 읽기 쉬운 방식으로 약간의 FP를 Java에 추가 할 수 있습니다. 특히 이것에서 폐쇄 위키 페이지 당신은 당신이 달성하려는 것과 매우 유사한 예를 찾을 수 있습니다.

이것은 분명히 당신의 통화이지만, 내가 사용한 대부분의 API 데모에서 나는 당신이 상단에있는 더 긴 형식을 선호합니다. 코드를 살펴본 후에는 일반적으로 API 작업을 확인하기 위해 복사 및 붙여 넣기를 수행하여 여기에서 수정한다고 생각합니다. 반복적 인 작품 중 일부를 숨기려는 형식을 변경하는 것은 확실히 OO 개발을 위해하고 싶은 일이지만, 이런 데모 코드는 '청정 코드 신'이 이해할 수있는 것입니다 :-).

Java에서는이 작업을 수행 할 방법이 없지만 가능하다면 Groovy를 사용해보십시오. 비슷한 랩핑을 가질 수있는 다른 옵션은 측면을 사용하는 것입니다. 보다 종자.

Java에서 수행되는 방식은 하나의 방법이있는 인터페이스를 만드는 것입니다. 코드에서 해당 인터페이스를 구현하는 클래스를 사용합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top