디자인 패턴이 포함된 실용적인 Java15 밀폐형 인터페이스
abstract class MiddlewareBase {
static MiddlewareBase of(MiddlewareBase... middlewares) {
for (int i = 0; i < middlewares.length - 1; i++) {
middlewares[i].setNext(middlewares[i + 1]);
}
return middlewares[0];
}
private MiddlewareBase next;
public void setNext(MiddlewareBase next) {
this.next = next;
}
public final void check(Request request) {
checkInternal(request);
if (next != null) {
next.checkInternal(request);
}
}
abstract void checkInternal(Request request);
}
지금까지 이것은 훌륭하고 완벽해 보입니다. 이제 더 많은 추상화를 추가하고 단순한 구현이 아닌 인터페이스를 구현하는 프로그램을 달성하기 위해 인터페이스 관점에서 체인을 나타내는 미들웨어 인터페이스를 정의하겠습니다.
interface Middleware {
void check(Request request);
}
그런 다음 MiddlewareBase를 다음과 같이 다시 작성할 수 있습니다.
abstract class MiddlewareBase implements Middleware {
static Middleware of(MiddlewareBase... middlewares) {
for (int i = 0; i < middlewares.length - 1; i++) {
middlewares[i].setNext(middlewares[i + 1]);
}
return middlewares[0];
}
private MiddlewareBase next;
public void setNext(MiddlewareBase next) {
this.next = next;
}
public final void check(Request request) {
checkInternal(request);
if (next != null) {
next.checkInternal(request);
}
}
abstract void checkInternal(Request request);
}
이것과 미들웨어의 다음 두 가지 간단한 예
class CsrfMiddleware extends MiddlewareBase {
@Override
void checkInternal(Request request) {
System.out.println("csrf check");
}
}
class XssMiddleware extends MiddlewareBase {
@Override
void checkInternal(Request request) {
System.out.println("xss check");
}
}
다음과 같이 미들웨어 체인을 정의하고 사용할 수 있습니다.
Middleware middleware = MiddlewareBase.of(new CsrfMiddleware(),
new XssMiddleware());
middleware.check(new Request());
그러나 어떤 것도 다른 사람이 미들웨어 인터페이스를 구현하는 것을 방해하고 체인 구현을 끊을 수 없습니다.
— — — — — —
버전 15부터 미리 보기 기능으로 JDK는 봉인된 클래스/인터페이스 기능을 제공하여 이를 확장하거나 구현할 수 있는 다른 클래스나 인터페이스를 제한했습니다.
sealed
한정자를 사용하여 봉인된 인터페이스/클래스를 정의할 수 있습니다. 그런 다음 extends
및 implements
절 다음에 permits
절이 봉인된 클래스를 확장할 수 있는 클래스를 지정합니다.sealed interface Handler permits HandlerTemplate {
void handle(Handleable handleable);
}
이 정의를 사용하면
HandlerTemplate
를 제외한 어떤 클래스도 Handler
인터페이스를 구현할 수 없습니다.이제 미들웨어 예제를 봉인된 인터페이스로 재정의하여 아무도 그것을 구현하고 CoR 구현으로서의 주요 목적을 깨뜨릴 수 없도록 합시다.
sealed interface Middleware permits MiddlewareBase {
void check(Request request);
}
MiddlewareBase 클래스는 구현 클래스에 대한 제한이 없음을 의미하는 봉인되지 않은 한정자를 추가하는 것 외에는 변경 사항이 없습니다.
abstract non-sealed class MiddlewareBase implements Middleware {
...
}
또한
CsrfMiddleware
및 XssMiddleware
는 변경되지 않습니다.이제 우리가
Middleware
의 또 다른 구현을 만들려고 시도하면 컴파일러는 class is not allowed to extend sealed class: Middleware
를 불평하거나 intellij와 같은 IDE를 사용하여 직접 얻을 수 있습니다.봉인된 클래스/인터페이스에는 많은 유용한 사용 사례가 있으며 Java에서 아직 미리 보기로 새롭다고 생각하면 의도가 다른 Kotlin(봉인된 클래스만) 및 Scala(봉인된 특성)과 같은 다른 언어로 제공됩니다.
언어 기능이 풍부할수록 더 나은 디자인을 얻을 수 있다는 사실을 표현하기 위해 핵심 디자인 원칙과 패턴으로 봉인된 인터페이스에 접근했습니다. 의견을 환영합니다.
Reference
이 문제에 관하여(디자인 패턴이 포함된 실용적인 Java15 밀폐형 인터페이스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mhddurrah/cor-and-tm-design-patterns-with-java-sealed-interface-1cn8텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)