봉인 된 자바 상태 머신

몇 년 전에 자바에서 컴파일 타임에 유효한 전환 만 허용하는 상태 머신을 구현하는 방법에 대해 게시했습니다.

이것은 열거 형 대신 인터페이스를 사용했는데,이는 큰 단점을 가지고 있습니다-관련된 모든 상태를 알고 있다고 보장 할 수는 없습니다. 누군가 인터페이스를 구현하여 코드베이스의 다른 곳에 다른 상태를 추가 할 수 있습니다.

자바 15 는 봉인 된 클래스의 미리보기 기능을 제공합니다. 봉인 된 클래스를 통해이 단점을 해결할 수 있습니다. 이제 인터페이스 기반 상태 머신은 잘못된 전환을 방지 할 수있을뿐만 아니라 열거 형과 같이 열거 할 수 있습니다.

미리 보기 기능이 활성화된 상태에서 코드를 사용해 볼 수 있습니다. 인터페이스가 있는 상태 머신을 정의하는 방법은 다음과 같습니다.

{}정적 최종 클래스 솔리드 앰버는 트래픽 라이트를 구현하고,<레드>{}정적 최종 클래스 레드 트래픽 라이트를 구현하고,<플래시 앰버>{}정적 최종 클래스 레드 트래픽 라이트를 구현하고,<플래시 앰버>{}정적 최종 클래스 레드 트래픽 라이트를 구현하고,<플래시 앰버>{}정적 최종 클래스 레드 트래픽 라이트를 구현하고,<플래시 앰버>{}정적 최종 클래스 레드 트래픽 라이트를 구현하고,<플래시 앰버>{}정적 마지막 클래스 플래시앰버는 트래픽 라이트,<녹색으로의 전환을 구현합니다.> {}

새로운 부분은”봉인”및”허가”입니다. 이제 트래픽 라이트의 새로운 구현을 정의하는 컴파일 실패뿐만 아니라 신호등이 허용하지 않는 전환을 수행하는 컴파일 시간 실패 인 기존 동작이됩니다.

엔.또한 컴파일 시간 확인 버전을 건너 뛰고 여전히 유형 정의를 사용하여 전환을 런타임 검사 할 수 있습니다.

상태에서도 여러 전환이 가능합니다.

정적 최종 클래스 보류중인 구현 순서 상태,<체크 아웃으로 비트 전환,취소 됨> {}

봉인 된 클래스 덕분에 인터페이스 기반 상태 시스템에서 열거 형 스타일 열거 및 조회를 수행 할 수도 있습니다.

이 예제에서는 다음과 같은 방법을 사용합니다.이 예제에서는 다음과 같은 방법을 사용할 수 있습니다.이 예제에서는 다음과 같은 방법을 사용할 수 있습니다.이 예제에서는 다음과 같은 방법을 사용할 수 있습니다.클래스,체크 아웃.클래스,구입.클래스,배송.수업 취소.클래스,실패.클래스,환불.클래스),상태.값(주문 상태.클래스));어설 션 동일(0,새로운 보류().이 경우 다음과 같은 방법을 사용할 수 있습니다.서수());어설 션 동일(구입.클래스,상태.이 문제를 해결하는 방법은 무엇입니까?이 문제를 해결하기 위해 몇 가지 방법이 있습니다.클래스,상태.이 문제를 해결하는 방법은 무엇입니까?클래스,"취소됨"));}

이는 인터페이스의 허용된 서브클래스들을 열거할 수 있는 리플렉션 애피타이저를 제공하기 때문에 가능하다. 이 방법을 사용하여 상태 인터페이스에 위의 편의 방법을 추가하여 값(),서수()및 값()조회를 허용 할 수 있습니다.

예를 들어,다음과 같은 두 가지 방법이 있습니다:클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록,클래스 목록의(상태 기계 유형.허용 된 하위 클래스()).지도(상태::에서 클래스).수집(톨리스트());} static <T extends State<T>> Class<T> valueOf(Class<T> stateMachineType, String name) { assertSealed(stateMachineType); return valuesList(stateMachineType) .stream() .filter(c -> Objects.equals(c.getSimpleName(), name)) .findFirst() .orElseThrow(IllegalArgumentException::new);}static <T extends State<T>, U extends T> int ordinal(Class<T> stateMachineType, Class<U> instanceType) { return valuesList(stateMachineType).indexOf(instanceType);}

전환 검사 작동 방식에 대한 자세한 내용과 원래 게시물에서 유용 할 수있는 위치에 대한 더 많은 예가 있습니다. 코드는 깃허브에 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다.