Заполните перечисление со значениями от базы данных

Вы можете достичь желаемого, используя некоторое абсолютное позиционирование и высоту строки:

.timebox {
  display: inline-block;
  line-height: 2em;
  height: 4em;          /* only wants to be double the line-height */
  overflow: hidden;
  position: relative;
  width: 2em;           /* can be what you want */
}

.inner {
  height: 6em;                  /* timebox line-height multiplied by 3 (number of numbers */
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
}

.number {
  width: 2em;
  text-align: center;
}
<div class="timebox">
  <div class="inner">
    <div class="number">
      1
    </div>
    <div class="number">
      2
    </div>
    <div class="number">
      3
    </div>
  </div>
</div>
<div class="timebox">
  <div class="inner">
    <div class="number">
      21
    </div>
    <div class="number">
      22
    </div>
    <div class="number">
      23
    </div>
  </div>
</div>

24
задан Jacques René Mesrine 12 May 2009 в 06:46
поделиться

5 ответов

Перечисления всегда фиксируются во время компиляции. Единственный способ сделать это - динамически сгенерировать соответствующий байт-код.

Сказав это, вам, вероятно, следует выяснить, какие аспекты перечисления вас действительно интересуют. Предположительно, вы не хотели использовать switch , так как это будет означать статический код, и вы не знаете значения статически ... как и любые другие ссылки в коде.

Если вам действительно нужна карта из String to Integer , вы можете просто использовать Map , которую вы заполняете во время выполнения, и все готово. Если вам нужны функции EnumSet , их будет сложнее воспроизвести с такой же эффективностью,

31
ответ дан 28 November 2019 в 22:35
поделиться

Enums are not dynamic, so the short answer is that you can't do it.

Also have a look at Stack Overflow question Dynamic enum in C#.

3
ответ дан 28 November 2019 в 22:35
поделиться

Вам необходимо скопировать в коде то, что находится в базе данных (или наоборот). См. Этот вопрос для получения хороших советов.

1
ответ дан 28 November 2019 в 22:35
поделиться

Это немного сложно, поскольку заполнение этих значений происходит во время загрузки класса. Так что вам понадобится статический доступ к соединению с базой данных.

Как бы я ни дорожил его ответами, я думаю, что на этот раз Джон Скит может ошибаться.

Взгляните на это:

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;
    }
}
26
ответ дан 28 November 2019 в 22:35
поделиться

На всех известных мне языках перечисления статичны. Компилятор может их оптимизировать. Поэтому краткий ответ - нет, вы не можете.

Вопрос в том, почему вы хотите использовать перечисление таким образом. Что вы ожидаете? Или, другими словами, почему бы вместо этого не использовать коллекцию?

0
ответ дан 28 November 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: