2013-11-23 3 views
2

Java의 내장 열거 형 클래스에 요소를 추가 할 수있는 방법이 있습니까?런타임시 열거 형 변경 Java

내 질문은 Can I add and remove elements of enumeration at runtime in Java과 비슷하지만,이 질문은 자신의 열거 형을 구성한 다음 수정하는 것으로 보입니다. 어디 선가 내가 바꿀 수없는 기존의 열거,

enum Days{ MONDAY, TUESDAY, WEDNESDAY } 

같은 것이있다 있으리라 믿고있어 난 그것에 등 목요일, 금요일을 추가 할. 안타깝게도 목표를 달성하기 위해 인터페이스를 사용하는 방법이나 열거 형보다 효과적 일 수있는 방법에 대한 제안은 여기에 적용되지 않습니다.

이해할 수 있듯이 열거 형은 암시 적으로 최종적이므로 확장하고 더 많은 요소를 추가 할 수 없습니다. 개인 필드가 있지만 액세스 할 때 리플렉션을 사용할 수있는 것으로 보입니다. 새 필드를 추가 할 수는 없어도 개인 필드 중 하나를 변경할 수 있습니까? 예 : 월요일에서 목요일로 변경 하시겠습니까?

편집 : 상황의 명확한 설명은

사람들은이 프로그램에 컴파일되기 전에 코드를 변경 제안했다. 내 코드는 변경할 수없는 더 큰 프로젝트의 일부입니다. 열거 형 클래스는 내 클래스가 액세스하기 전에 큰 프로그램에 의해로드됩니다. 그 시점에서 누락 된 요소를 열거 형에 추가하고 싶습니다. 바이트 코드 조작은 아직 진행 중입니까?

+1

나는 이것을하지 않아야한다고 생각하지만, 정말로 주장한다면 [이 블로그 게시물] (http://www.jroller.com/VelkaVrana/entry/modify_enum_with_reflection)은 원하는대로 보이는 것 같습니다. –

+0

나는 완전히 이해하지 못합니까? 다음 코드가 있다고 가정합니다. Days firstDay = Days.MONDAY. 지금 무엇을 수정 하시겠습니까? – isnot2bad

답변

0

런타임에 열거 형을 변경하여 클래스를로드하기 전에 런타임에 변경할 수 있습니다. 런타임에 변경된 enum을 컴파일하고로드하거나 바이트 코드 조작을 사용하여 변경할 수 있습니다.

요약하면 필요한 모든 열거 형을 포함하고 있으므로 런타임에 열거 형을 추가 할 필요가 없습니다. 예 : 1 주일에 7 일 밖에 없으면 컴파일 타임에 모두 포함하십시오.

+0

"바이트 코드 조작으로 어떻게 변경합니까?" 나는 모든 7 일을 포함했을 것입니다. 그러나 나는 열거 할 수없는 열거 형을 사용하고 있습니다. 그 이유는 7 일을 포함하지 않았기 때문입니다. (이유를 모르겠습니다) –

+0

당신이 그것을 바꿀 수 있거나, 티. 그것을 바꿀 수 있다면 이것을 할 수있는 많은 방법이 있습니다. 당신이 그것을 바꿀 수 없다면 나는 왜 그런지 알고 싶습니다.가장 간단한 해결책은 클래스를 디 컴파일하거나 소스를 가져 와서 편집하고 대신 수정 된 버전을 사용하는 것입니다. –

2

열거 형은 상수 감각을 가진 정적, 최종, 변경 불가능한 인스턴스 제어 개체입니다. 프로젝트에 컴파일 할 때 알려진 자연스러운 그룹 또는 목록이 포함되어 있으면 열거 형을 생각해야합니다.

JVM은 enum이 인스턴스 제어되고 런타임에 불변임을 보장합니다. 열거 형의 이진 호환성도 보장되므로 나중에 열거 형 상수를 추가하면 프로그램이 계속 실행됩니다.

짧은 대답은 "아니요. 자바에서 enum 클래스를 쉽게 확장 할 수있는 방법이 없습니다."

한 가지 대안은 enum 상수의 기본 유형으로 사용되는 인터페이스를 기본 enum으로 구현하는 것입니다.

그런 다음 인터페이스를 구현하는 새 enum을 생성하여 열거 형을 "확장"할 수 있습니다. 그럼에도 불구하고, 이것은 의도적으로 런타임에 실행되도록 의도 된 것이 아닙니다.

+0

좋은 생각 같지만 기본 enum을 변경하여 인터페이스를 구현할 수는 없습니다. 나는 열거 형 선언을 전혀 변경할 수 없다. 그것은 내 것이 아니다. "아니오, 쉬운 방법이 없다"고 말할 때 ... "할 수있는"어려운 "방법이 있습니까? –

+0

피터로 레이 (Peter Lawrey)가 말했듯이, "어려운"방법은 클래스가로드되기 전에 클래스를 변경하는 것입니다. 다시 말해, JVM 구현은 런타임에 열거 형의 불가침 가능성에 대해 엄격한 보장을하기 때문에 (즉, 안전함)이 방법이어야합니다. 부족한 열거 형을 직접 작성한 올바른 열거 형으로 바꿀 수있는 방법이 있습니까? 아니면 바이트 코드를 사용 가능하도록 편집 한 열거 형 열거 형으로 바꾸는 방법이 있습니까? – scottb