java で列挙を使ったコードと、コード値を分離するサンプルを作ってみました。 環境は JDK 1.7、PostgreSQL 9.2 です。 作成には Eclipse 3.7 Indigo Pleiades All in One (MergeDoc Project で公開されています) を利用させていただきました。ありがたく深謝いたします。
※なお、コード値の保持には OTLT (One True Lookup Table: 単一参照テーブル) を使っています。 OTLT には賛否両論ありますので、OTLT にしない場合は、テーブルからのコード値のロード部分を適宜変更してくださいませ m(_*_)m
package sample;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
public class Main {
/**
* コード値の動的ロードのサンプル
*/
public static void main(String[] args) {
try {
//
// コード値をロードする
//
DynCodeImpl.loadValues();
//
// ロードしたコード値を表示してみる
//
// 果物
System.out.format("%s: [%s]\n", Fruit.ORANGE.name(), Fruit.ORANGE.getValue());
System.out.format("%s: [%s]\n", Fruit.APPLE.name(), Fruit.APPLE.getValue());
// 動物
System.out.format("%s: [%s]\n", Animal.DOG.name(), Animal.DOG.getValue());
System.out.format("%s: [%s]\n", Animal.CAT.name(), Animal.CAT.getValue());
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* コード値を取得するためのインタフェース
*/
interface DynCode {
String getValue();
}
/**
* コード値を動的にロード・取得するための実装
*/
public static class DynCodeImpl implements DynCode {
private String type;
private String name;
private String value = null;
public DynCodeImpl(String type, String name) {
this.type = type;
this.name = name;
}
@Override
public String getValue() {
if (this.value == null) {
String result = "";
Map<String, String> nameToValueMap = dyncodeMap.get(this.type);
if (nameToValueMap != null) {
String val = nameToValueMap.get(this.name);
if (val != null) {
result = val;
}
}
this.value = result;
}
return this.value;
}
/**
* コード値を保持するマップ
*/
private static Map<String, Map<String, String>> dyncodeMap = new HashMap<String, Map<String, String>>();
/**
* コード値をロードする
*/
public static void loadValues() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("org.postgresql.Driver");
conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/sample", "sample", "sample");
StringBuilder sql = new StringBuilder();
sql.append("SELECT * FROM DYNCODE");
sql.append(" ORDER BY TYPE, NAME");
ps = conn.prepareStatement(sql.toString());
rs = ps.executeQuery();
while (rs.next()) {
String type = rs.getString("TYPE");
String name = rs.getString("NAME");
String value = rs.getString("VALUE");
Map<String, String> nameToValueMap = dyncodeMap.get(type);
if (nameToValueMap == null) {
nameToValueMap = new HashMap<String, String>();
}
nameToValueMap.put(name, value);
dyncodeMap.put(type, nameToValueMap);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
}
/**
* 果物
*/
private enum Fruit implements DynCode {
ORANGE,
APPLE,
;
private DynCode dynCode;
private Fruit() {
this.dynCode = new DynCodeImpl(this.getDeclaringClass().getSimpleName(), this.name());
}
@Override
public String getValue() {
return dynCode.getValue();
}
}
/**
* 動物
*/
private enum Animal implements DynCode {
DOG,
CAT,
;
private DynCode dynCode;
private Animal() {
this.dynCode = new DynCodeImpl(this.getDeclaringClass().getSimpleName(), this.name());
}
@Override
public String getValue() {
return dynCode.getValue();
}
}
}
DROP TABLE DYNCODE;
CREATE TABLE DYNCODE (
TYPE VARCHAR(20) NOT NULL,
NAME VARCHAR(20) NOT NULL,
VALUE VARCHAR(20) NOT NULL,
PRIMARY KEY (TYPE, NAME)
);
INSERT INTO DYNCODE VALUES ('Fruit', 'ORANGE', '00001');
INSERT INTO DYNCODE VALUES ('Fruit', 'APPLE', '00002');
INSERT INTO DYNCODE VALUES ('Animal', 'DOG', 'ABC010');
INSERT INTO DYNCODE VALUES ('Animal', 'CAT', 'ABC020');