[갭을 염두에 두십시오 : 최선의 해결책은 열거 형을 완전히 없애는 것이지만 그 것은 코멘트에 언급 된 바와 같이 오늘은 선택 사항이 아니라는 것을 알고 있지만 (먼 미래) 계획되어 있습니다.]Java 열거 형 값에 대한 종속성을 제거하는 방법은 무엇입니까?
두 가지 배포 단위 인 frontend와 backend가 있습니다. 프론트 엔드는 enum을 사용하고 enum을 매개 변수로 사용하여 백엔드에서 EJB 서비스를 호출합니다. 그러나 enum은 자주 변경되므로 백엔드가 그 값을 알기를 원하지 않습니다.
문자열 열거하는 것은 아니고 문자열 상수를 사용하는 것입니다
가능한 솔루션을 상수,하지만 프론트 엔드에서 작은 많은 변화를 일으킬 것입니다. 나는 프론트 엔드에서 가능한 한 적은 변화를 일으키는 해결책을 찾고있다.
래퍼 클래스
다른 해결책은 열거 같은 인터페이스 래퍼 클래스의 사용이다. 열거 형은 래퍼 클래스가되고 열거 형 값은 해당 래퍼 내의 상수가됩니다. 객체 식별 (enum이하는 것처럼)을 보장하기 위해 일부 비 직렬화 코드를 작성해야했지만 올바른 해결책인지 여부는 알 수 없습니다. 다른 클래스 로더가 사용된다면 어떨까요? 래퍼 클래스는 백엔드의 열거 형을 대체 할 Java 인터페이스를 구현합니다. 하지만 deserialiaztion 코드가 백엔드에서도 실행됩니까? 래퍼 클래스에 대한
예 :
public class Locomotion implements Serializable {
private static final long serialVersionUID = -6359307469030924650L;
public static final List<Locomotion> list = new ArrayList<Locomotion>();
public static final Locomotion CAR = createValue(4654L);
public static final Locomotion CYCLE = createValue(34235656L);
public static final Locomotion FEET = createValue(87687L);
public static final Locomotion createValue(long type) {
Locomotion enumValue = new Locomotion(type);
list.add(enumValue);
return enumValue;
}
private final long ppId;
private Locomotion(long type) {
this.ppId = type;
}
private Object readResolve() throws ObjectStreamException {
for (Locomotion enumValue : list) {
if (this.equals(enumValue)) {
return enumValue;
}
}
throw new InvalidObjectException("Unknown enum value '" + ppId + "'");
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (ppId^(ppId >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Locomotion)) {
return false;
}
Locomotion other = (Locomotion) obj;
if (ppId != other.ppId) {
return false;
}
return true;
}
}
이미 같은 문제가 있었나요? 어떻게 그걸 해결 했니?
+1 열거 형 직렬화 논리 및 "스위치 문제". 하지만 서버 측에서 열거 형을 다시 작성하면 새로운 값을 추가 할 때 재배포해야하므로 전체가 무의미 해집니다. –
@Chris 직렬화로 인해 열거 형을 매개 변수로 사용하려는 경우이를 수행 할 방법이 없습니다. 여전히 코드 이동성이 있습니다. 그것이 당신을 위해 그것을 만들지 않는다면 Mandrake만이 :-) –