Вы можете достичь желаемого, используя некоторое абсолютное позиционирование и высоту строки:
.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>
Перечисления всегда фиксируются во время компиляции. Единственный способ сделать это - динамически сгенерировать соответствующий байт-код.
Сказав это, вам, вероятно, следует выяснить, какие аспекты перечисления вас действительно интересуют. Предположительно, вы не хотели использовать switch
, так как это будет означать статический код, и вы не знаете значения статически ... как и любые другие ссылки в коде.
Если вам действительно нужна карта из String
to Integer
, вы можете просто использовать Map
, которую вы заполняете во время выполнения, и все готово. Если вам нужны функции EnumSet
, их будет сложнее воспроизвести с такой же эффективностью,
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#.
Вам необходимо скопировать в коде то, что находится в базе данных (или наоборот). См. Этот вопрос для получения хороших советов.
Это немного сложно, поскольку заполнение этих значений происходит во время загрузки класса. Так что вам понадобится статический доступ к соединению с базой данных.
Как бы я ни дорожил его ответами, я думаю, что на этот раз Джон Скит может ошибаться.
Взгляните на это:
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;
}
}
На всех известных мне языках перечисления статичны. Компилятор может их оптимизировать. Поэтому краткий ответ - нет, вы не можете.
Вопрос в том, почему вы хотите использовать перечисление таким образом. Что вы ожидаете? Или, другими словами, почему бы вместо этого не использовать коллекцию?