표준 Functional Interface들을 재정의하면 안 됩니다.

 

커스텀한 String 클래스를 작성할 이유가 없는 것처럼, 기존의 표준 Functional Interface 를 다시 정의할 이유가 없습니다.

이름을 새로 지음으로서 약간의 추가적인 문맥을 더 넣어 줄 수 있기 때문에, 그렇게 하는 것이 매력적이게 보일 수 있습니다. 하지만 장기적으로 유지 보수를 하는 프로그래머들이 재정의 된 Functional Interface와 표준 Functional Interface가 뭐가 다른지 궁금해 할 수 있고, 혼란의 원인이 될 수 있습니다.

규칙을 어긴 코드

@FunctionalInterface
public interface MyInterface { // 규칙을 어긴 코드
	double toDouble(int a);
}

@FunctionalInterface
public interface ExtendedBooleanSupplier { // 규칙을 어긴 코드
  boolean get();
  default boolean isFalse() {
    return !get();
  }
}

public class MyClass {
    private int a;
    public double myMethod(MyInterface instance){
	return instance.toDouble(a);
    }
}

규칙을 준수한 해결책

@FunctionalInterface
public interface ExtendedBooleanSupplier extends BooleanSupplier { // 규칙을 준수한 코드, java.util.function.BooleanSupplier을 상속하고 있습니다.
  default boolean isFalse() {
    return !getAsBoolean();
  }
}

public class MyClass {
    private int a;
    public double myMethod(IntToDoubleFunction instance){
	return instance.applyAsDouble(a);
    }
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project