문제

문자열-> 정수를지도하는 테이블이 있습니다.

열거를 정적으로 만들기보다는 데이터베이스의 값으로 열거를 채우고 싶습니다. 이게 가능해 ?

따라서 이것을 정적으로 삭제하기보다는 다음과 같습니다.

public enum Size { SMALL(0), MEDIUM(1), LARGE(2), SUPERSIZE(3) };

{0,1,2,3} 숫자가 기본적으로 무작위 이므로이 열거 곡을 동적으로 만들고 싶습니다 (데이터베이스의 자동화 열에 의해 자율적이기 때문에).

도움이 되었습니까?

해결책

아니요. 열거는 항상 컴파일 타임에 고정됩니다. 이를 수행 할 수있는 유일한 방법은 관련 바이트 코드를 dyamically로 생성하는 것입니다.

말하면, 당신은 아마 당신이 실제로 관심있는 열거의 어떤 측면을 해결해야 할 것입니다. 아마도 당신은 아마도 당신이 사용하고 싶지 않았을 것입니다. switch 정적 코드를 의미하며 정적으로 값을 알지 못합니다. 코드의 다른 참조와 마찬가지로 값을 알지 못합니다.

당신이 정말로 당신이 단지지도를 원한다면 String 에게 Integer, 당신은 만 사용할 수 있습니다 Map<String, Integer> 실행 시간에 채워지면 끝났습니다. 당신이 원한다면 EnumSet 특징은 동일한 효율성으로 재생산하기가 다소 까다로울 수 있지만 약간의 노력으로 실현 가능할 수 있습니다.

따라서 구현에 대한 생각의 관점에서 더 나아 가기 전에 실제 요구 사항이 무엇인지 알아내는 것이 좋습니다.

(편집 : 나는이 열거가 완전히 역동적이라고 가정했습니다. 즉, 이름을 모르거나 이름 세트가 고정되어 있고 귀하가있는 경우 데이터베이스에서 ID를 가져와야합니다. 매우 다른 문제입니다. 안드레아스의 대답.)

다른 팁

해당 값의 모집단은 클래스로드 타임에 발생하기 때문에 이것은 약간 까다 롭습니다. 따라서 데이터베이스 연결에 대한 정적 액세스가 필요합니다.

내가 그의 대답을 소중히 여기는 한, 나는 이번에는 Jon Skeet이 잘못되었을 것이라고 생각합니다.

이것을 살펴보십시오 :

public enum DbEnum {
    FIRST(getFromDb("FIRST")), SECOND(getFromDb("second"));

    private static int getFromDb(String s) {
        PreparedStatement statement = null;
        ResultSet rs = null;
        try {
            Connection c = ConnectionFactory.getInstance().getConnection();
            statement = c.prepareStatement("select id from Test where name=?");
            statement.setString(1, s);
            rs = statement.executeQuery();
            return rs.getInt(1);

        }
        catch (SQLException e) {
           throw new RuntimeException("error loading enum value for "+s,e);
        }
        finally {
            try {
                rs.close();
                statement.close();
            } catch (SQLException e) {
                //ignore
            }
        }
        throw new IllegalStateException("have no database");
    }

    final int value;

    DbEnum(int value) {
        this.value = value;
    }
}

개선 Andreas가 한 일, 데이터베이스의 내용을 맵에로드하여 필요한 데이터베이스 연결 수를 줄일 수 있습니다.

public enum DbEnum {
    FIRST(getFromDb("FIRST")),
    SECOND(getFromDb("second"));

    private Map<String,Integer> map;
    private static int getFromDB(String s)
    {
        if (map == null)
        {
           map = new HashMap<String,Integer>();
           // Continue with database code but get everything and
           // then populate the map with key-value pairs.
           return map.get(s);
        }
        else {
            return map.get(s); }
    }
}

열거는 역동적이지 않으므로 짧은 대답은 할 수 없다는 것입니다.

또한 스택 오버플로 질문을 살펴보십시오 C#의 동적 열거.

데이터베이스에있는 내용 (또는 그 반대로)의 코드에서 복제해야합니다. 이것 좀 봐 의문 좋은 조언을 위해.

내가 알고있는 모든 언어에서 열거는 정적입니다. 컴파일러는 일부 최적화를 만들 수 있습니다. 따라서 짧은 대답은 아니오입니다.

문제는 왜 이런 식으로 열거를 사용하고 싶은지입니다. 당신은 무엇을 기대합니까? 즉, 대신 컬렉션을 사용하지 않는 이유는 무엇입니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top