Если я правильно понимаю, требования следующие:
- с методом MyType.byId (Integer id), который доставляет некоторые предопределенные значения
- , его также следует динамически расширять изТаблица
Type
из базы данных
Таким образом, перечисление не может быть динамически расширено, но мы можем переключиться на класс.
Поэтому, оставаясь близко к вашему коду, можно написать что-то вроде:
import java.util.HashMap;
import java.util.Map;
public class MyType {
static Map<Integer, MyType> idMap = new HashMap<>();
static {
idMap.put(10, new MyType("First Type"));
idMap.put(20, new MyType("Second Type"));
}
private final String name;
private MyType(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static MyType byId(Integer id) {
return idMap.get(id);
}
public static void addType(String name, Integer id) {
MyType lookup = byId(id);
if(lookup != null) {
if(!lookup.getName().equals(name)) {
System.out.println("conflicting redefinition for id " + id + ": '" + name + "' vs '" + lookup.name + "'");
//handle...
}
}
idMap.put(id, new MyType(name));
}
}
Тестовые данные
Давайте предположим, что в базе данных есть следующее:
stephan=# select * from Type;
id | name
----+-------------
30 | Third Type
10 | First Type
20 | Second Type
(3 rows)
Итак, в базе данных у нас есть предопределенные типы с id = 10 и id = 20, а также тип с id = 30, который не известен по умолчанию для приложения.Но мы можем заполнить типы из базы данных.
Контрольный пример
public static void main(String[] args) {
try {
Connection connection = createConnection();
try (connection) {
populateTypes(connection);
}
MyType type;
type = MyType.byId(10);
System.out.println(type.getName());
type = MyType.byId(20);
System.out.println(type.getName());
type = MyType.byId(30);
System.out.println(type.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
Пример JDBC
Это не 'Неважно, какая технология базы данных используется для получения значений.Вот пример для JDBC:
private static void populateTypes(Connection connection)
throws SQLException {
String sql = "SELECT * FROM type";
try (Statement st = connection.createStatement()) {
try (ResultSet rs = st.executeQuery(sql)) {
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
MyType.addType(name, id);
}
}
}
}
Демонстрационный вывод
First Type
Second Type
Third Type
Это то, что вы ищете?