각 메시지 개체에는 고유 식별자가 해당하는 메시지 개체 집합이 있습니다. 각 메시지는 Map 또는 ByteBuffer (메시지는 바이너리이지만 우리는 바이너리 표현과주고받는 방법을 안다.)로부터 만들 수있다.Java 정적 팩토리 메서드 및 스위치 문
public static Message fromMap(int uuid, Map<String, Object> fields) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(fields);
.
.
.
default:
// Error
return null;
}
}
public static Message fromByteBuffer(int uuid, ByteBuffer buffer) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(buffer);
.
.
.
default:
// Error
return null;
}
}
이제, 항목 1에 대한 Josh Bloch's Effective Java 회담이 : 다음과 같이
이러한 메시지를 구성하는 현재의 구현은 대략입니다 대신 생성자의 정적 팩토리 메소드를 고려, 이것은이 패턴이 어디 장소를 것 같다 유용합니다 (클라이언트는 Message 하위 유형의 생성자에 직접 액세스하지 않고 대신이 메소드를 사용합니다). 그러나 저는 두 개의 switch 문을 항상 업데이트해야한다는 사실을 기억해야합니다 (DRY 원칙을 위반 함).
이 작업을 수행하는 가장 좋은 방법에 대해 통찰력을 주셔서 감사합니다. 우리는 객체를 캐싱하지 않습니다 (fromMap 또는 fromByteBuffer에 대한 각각의 호출은 새로운 객체를 반환합니다). 이렇게하면 정적 팩토리 메소드를 사용하는 이점을 무효화합니다. 이 코드에 관한 어떤 것이 나를 잘못 생각한 것입니다. 그래서 이것이 새로운 객체를 만들 수있는 올바른 방법인지 아니면 더 나은 해결책이 될지에 대한 커뮤니티의 생각을 듣고 싶습니다.
팩토리 객체가 맵에 저장되고 uuid로 검색되면 스위치가 필요하지 않습니다. – rsp
그래, 그게 내가 말한거야 :-) 나는 당신의 대답에 대한 링크도 추가했다. :) – Fortega
그것은 좋은 해결책이다. (그래서 +1).하지만 목표가 더블 스위치를 없애는 것이었다면, 스위치 로직을 별도의 방법으로 출력하십시오. (지도는 기본적으로 가장 위장한 스위치입니다.) – wds