방금 Java가 열거 형이 인터페이스를 구현하도록 허용한다는 것을 알았습니다. 이를위한 좋은 사용 사례는 무엇입니까?
답변
열거 형은 패시브 세트 (예 : 색상)를 나타내지 않아도됩니다. 그들은 기능을 더 복잡한 객체를 나타낼 수 있습니다, 그래서 당신은 가능성이에 더 기능을 추가 할 수있는 좋은 방법입니다 – 당신과 같은 인터페이스 할 수 있습니다 예 Printable
, Reportable
이들을 지원 등 및 구성 요소를.
답변
다음은 한 가지 예입니다 (유효한 Java 2nd Edition에있는 유사 / 더 나은 예).
public interface Operator {
int apply (int a, int b);
}
public enum SimpleOperators implements Operator {
PLUS {
int apply(int a, int b) { return a + b; }
},
MINUS {
int apply(int a, int b) { return a - b; }
};
}
public enum ComplexOperators implements Operator {
// can't think of an example right now :-/
}
이제 Simple + Complex 연산자의 목록을 얻으려면 다음을 수행하십시오.
List<Operator> operators = new ArrayList<Operator>();
operators.addAll(Arrays.asList(SimpleOperators.values()));
operators.addAll(Arrays.asList(ComplexOperators.values()));
따라서 인터페이스를 사용하여 확장 가능한 열거 형을 시뮬레이션합니다 (인터페이스를 사용하지 않으면 불가능합니다).
답변
Comparable
여러 사람에 의해 주어진 예제는 여기에 있기 때문에, 잘못 Enum
이미 구현이. 당신은 그것을 무시할 수 없습니다.
더 좋은 예는 데이터 유형을 정의하는 인터페이스를 갖는 것입니다. 간단한 유형을 구현하는 열거 형을 가질 수 있고 복잡한 유형을 구현하는 일반 클래스를 가질 수 있습니다.
interface DataType {
// methods here
}
enum SimpleDataType implements DataType {
INTEGER, STRING;
// implement methods
}
class IdentifierDataType implements DataType {
// implement interface and maybe add more specific methods
}
답변
내가 자주 사용하는 경우가 있습니다. IdUtil
매우 간단한 Identifiable
인터페이스를 구현하는 객체로 작업하는 정적 메서드 가있는 클래스가 있습니다.
public interface Identifiable<K> {
K getId();
}
public abstract class IdUtil {
public static <T extends Enum<T> & Identifiable<S>, S> T get(Class<T> type, S id) {
for (T t : type.getEnumConstants()) {
if (Util.equals(t.getId(), id)) {
return t;
}
}
return null;
}
public static <T extends Enum<T> & Identifiable<S>, S extends Comparable<? super S>> List<T> getLower(T en) {
List<T> list = new ArrayList<>();
for (T t : en.getDeclaringClass().getEnumConstants()) {
if (t.getId().compareTo(en.getId()) < 0) {
list.add(t);
}
}
return list;
}
}
내가 만들면 Identifiable
enum
:
public enum MyEnum implements Identifiable<Integer> {
FIRST(1), SECOND(2);
private int id;
private MyEnum(int id) {
this.id = id;
}
public Integer getId() {
return id;
}
}
그런 다음 id
이 방법으로 얻을 수 있습니다 .
MyEnum e = IdUtil.get(MyEnum.class, 1);
답변
Enum은 인터페이스를 구현할 수 있으므로 싱글 톤 패턴을 엄격히 적용하는 데 사용할 수 있습니다. 싱글 톤으로 표준 클래스를 만들려고하면 …
- 리플렉션 기법을 사용하여 개인 메서드를 공개로 노출 할 수있는 가능성
- 싱글 톤에서 상속하고 싱글 톤의 메소드를 다른 것으로 재정의
싱글 톤으로서 열거 형은 이러한 보안 문제를 방지하는 데 도움이됩니다. 이것은 Enum이 클래스로 작동하고 인터페이스를 구현하게하는 주된 이유 중 하나 일 수 있습니다. 그냥 추측.
자세한 내용은 /programming/427902/java-enum-singleton 및 Java의 싱글 톤 클래스를 참조 하십시오 .
답변
확장 성이 필요합니다. 누군가 개발 한 API를 사용하는 경우 정의한 열거 형은 정적입니다. 추가하거나 수정할 수 없습니다. 그러나 인터페이스를 구현하게하면 API를 사용하는 사람이 동일한 인터페이스를 사용하여 자체 열거 형을 개발할 수 있습니다. 그런 다음이 열거 형을 열거 형 관리자에 등록하여 표준 인터페이스와 함께 열거 형을 집약합니다.
편집 : @Helper Method에는 완벽한 예가 있습니다. 다른 라이브러리가 새로운 연산자를 정의하고 관리자 클래스에 ‘이 열거 형이 존재합니다-등록하십시오’라고 알려주십시오. 그렇지 않으면 자신의 코드에서만 연산자를 정의 할 수 있습니다. 확장 성이 없습니다.
답변
열거 형은 변장 된 클래스 일 뿐이므로 대부분 열거 형으로 수행 할 수있는 클래스로 수행 할 수있는 모든 작업입니다.
열거 형이 인터페이스를 구현할 수 없어야하는 이유를 생각할 수 없으며 동시에 그들에게도 좋은 이유를 생각할 수 없습니다.
인터페이스 또는 메소드와 같은 것을 열거 형에 추가하기 시작하면 실제로 클래스로 만드는 것을 고려해야합니다. 물론 나는 비 전통적인 열거 형 일을하는 데 유효한 사례가 있다고 확신하며, 그 한계는 인공적인 것이기 때문에 사람들이 원하는 것을 할 수있게하는 것을 선호합니다.