Bei der Entwicklung eines Systems Es gibt viele Fälle, in denen Sie den Teilungswert mit seiner Bedeutung verknüpfen möchten, z. B. "1: männlich, 2: weiblich", "A: ausgezeichnet B: gut C: akzeptabel D: nein". Es gibt auch viele Fälle, in denen Sie einen Teilungswert in eine Zeichenfolge konvertieren möchten.
Dieses Mal möchte ich die Methode mit Java Enum und die Methode zum Speichern in der Mastertabelle der DB vergleichen.
Es wird davon ausgegangen, dass Java als Sprache und MySQL als Datenbank verwendet wird.
In Java5 und höher gibt es das Konzept des Aufzählungstyps. Effektives Java empfiehlt außerdem, es als Konstante zu verwenden.
Definieren Sie zunächst die folgende Encoder-Schnittstelle.
Encoder-Schnittstelle
/**
*Encoder-Schnittstelle für Enum
*
* @param <T>Aufzählung Definition
*/
public interface Encodable<T extends Serializable> {
/**
*Encoder
*
* @Enum-Definition zurückgeben
*/
T getCode();
/**
*Gibt den Namen des Codes zurück.
*
* @Name zurückgeben
*/
String getName();
}
Um eine Zeichenfolge aus den Indikatorwerten zu generieren, definieren Sie die Decoderklasse wie folgt:
Decoder-Klasse
/**
*Decoderklasse für Enum
*
* @param <K>Codewert
* @param <V>Wert
*/
public class Decoder<K extends Serializable, V extends Encodable<K>> {
/**Kartendefinition*/
private Map<K, V> map;
/**
*Decoder
*
* @Parameterwerte Aufzählungsgruppe
*/
private Decoder(V[] values) {
map = new HashMap<K, V>(values.length);
for (V value : values) {
V old = map.put(value.getCode(), value);
//Unterstützt keine doppelten Codewerte
if (old != null) {
throw new IllegalArgumentException("duplicated code: " + value);
}
}
}
/**
*Decoder
*
* @Parametercode Codewert
* @Enum-Klasse zurückgeben
*/
public V decode(K code) {
return map.get(code);
}
/**
*Definition, um die Angabe des Typarguments wegzulassen
*
* @param <L>Codewert
* @param <W>Wert
* @Parameterwerte Aufzählungsgruppe
* @Rückgabecoder
*/
public static <L extends Serializable, W extends Encodable<L>> Decoder<L, W> create(W[] values) {
return new Decoder<L, W>(values);
}
}
Die eigentliche Klasse sieht folgendermaßen aus: Im Fall des Geschlechts wird es wie folgt sein.
Geschlechtsaufzählungsklasse
/**
*Geschlechtsaufzählungsklasse.
*
*/
public enum Gender implements
Encodable<Integer> {
/**Mann*/
MALE(1, "Mann"),
/**Frau*/
FEMALE(2, "Frau");
/**Decoder*/
private static final Decoder<Integer, Gender> DECODER = Decoder.create(values());
/**Codewert*/
private final Integer code;
/**Name*/
private final String name;
/**
*Konstrukteur.
*
* @Parametercode Codewert
* @Param Name Name
*/
private Gender(Integer code, String name) {
this.code = code;
this.name = name;
}
@Override
public Integer getCode() {
return code;
}
/**
*Ruft die Enum-Klasse aus dem Codewert ab.
*
* @Parametercode Codewert
* @Rückgabe Belegformat Enum-Klasse
*/
public static Gender decode(Integer code) {
return DECODER.decode(code);
}
/**
*Methode, um den Namen zu erhalten.
*
* @Name zurückgeben
*/
public String getName() {
return name;
}
}
Sie können den Namen mit der Decodierungsklasse und der getName-Methode wie unten gezeigt abrufen.
Anwendungsbeispiel
// 1:männlich
Gender male = Gender.decode(1);
String name = male.getName();
Wenn Sie es in das Programm schreiben und ihm einen aussagekräftigen Klassennamen geben, ist es gut lesbar und wartbar. Der Code ist einfach zu pflegen.
Sie können den Abteilungsnamen abrufen, ohne nacheinander eine Verbindung zur Datenbank herzustellen, sodass die Verarbeitung einfach ist.
Wenn ein Teilungswert hinzugefügt oder ein Name aufgrund einer Spezifikationsänderung usw. geändert wird, erfolgt eine Programmänderung und es werden auch Freigabearbeiten durchgeführt.
Ich denke, es ist eine gute Idee, Enum zu verwenden, um Dinge zu verwalten, die nicht geändert werden können, wie Geschlecht und Präfekturen in Japan. Wenn es sich ändert, ist es meiner Meinung nach oft notwendig, die Logik zu ändern.
Es ist so, als würden Sie IDs und ihre Namen mithilfe einer Mastertabelle wie der folgenden verwalten. Natürlich ist es möglich, zusätzlich zum Namen zusätzliche Informationen einzugeben.
Login User Master
CREATE TABLE login_user_mst (
id VARCHAR(11) NOT NULL,
password CHAR(40) NOT NULL comment 'Passwort',
name VARCHAR(255) NOT NULL comment 'Vollständiger Name',
name_kana VARCHAR(255) default NULL comment 'Nennen Sie Kana',
PRIMARY KEY(id)
) CHARACTER SET 'utf8'
COMMENT 'Benutzer anmelden';
Datenbeispiel
id | password | name | name_kana |
---|---|---|---|
10000001 | xxxxxxxxxxxxxx | Suzuki Nanako | Suzuki Nanako |
10000002 | xxxxxxxxxxxxxx | Matsumoto Kazuo | Matsumoto Kazuo |
10000003 | xxxxxxxxxxxxxx | Taku Watanabe | Watanabe Taku |
Um den Namen des Partitionswerts zu ändern, aktualisieren Sie einfach den DB-Datensatz Die Kosten sind recht gering, da sie ohne Programmänderungen geändert werden können.
Da Sie der Mastertabelle beitreten und den Namen nur mit SQL erhalten können, Sie benötigen lediglich die Logik, das SQL-Ergebnis auf dem Bildschirm anzuzeigen oder an CSV auszugeben.
Wenn beispielsweise ein Prozesszweig in Abhängigkeit vom Teilungswert auftritt, Weil es keine andere Wahl gibt, als diesen Klassifizierungswert auf der Anwendungsseite zu haben Selbst wenn Sie einen Wert in der Datenbank haben, befindet sich dieser in einem doppelten Wartungsstatus.
Wenn das Projekt die Regel hat, dass "alle Konstanten in der Mastertabelle verwaltet werden", Wenn es viele Arten von Konstanten gibt und Sie für jede Konstante eine Tabelle erstellen, wird eine große Anzahl von Mastertabellen erstellt. Wenn es sich um eine Mastertabelle handelt, ist es meiner Meinung nach immer noch einfach zu verwalten, wenn eine Regel wie das Präfix "mst_" vorhanden ist. ..
Verwaltung angemeldeter Benutzer, Informationen zum Verkaufsbüro, Ich denke, dass es gut ist, es für Dinge zu verwenden, die in vielen Fällen relativ verändert sind.
Ich denke, dass es (ewig) eine ewige Frage ist, wie man den Teilungswert und den Namen verwaltet. In meinem aktuellen Projekt verwende ich sowohl den Aufzählungstyp als auch den DB-Master. Ich denke, Sie sollten jedes Merkmal verstehen und verwenden.
Recommended Posts