最初に、このユースケースをモデル化するために列挙定数が必要であると仮定します。これは、血液検査の種類ごとに実行する特定のコードがあるためです (そうでない場合は、単純な文字列のセットで十分であり、より柔軟です。テストの数を前もって知る必要も、名前を気にする必要もありません)。
Q1: Java 列挙型は値のシーケンスにすぎないため、オブジェクト指向の性質を十分に活用できます。
public enum BloodTest {
AAA, BBB, CCC;
private static String[] names;
public static void setNames(String[] names) {
if (BloodTest.names != null)
throw new IllegalStateException("You can only set the names once");
if (names.length != values().length)
throw new IllegalArgumentException("Wrong number of names");
BloodTest.names = names;
}
@Override
public String toString() {
return names[ordinal()];
}
}
あとは、enum を呼び出して初期化するだけです。次に、標準メソッドをBloodTest.setNames(namesFromConfiguration)
呼び出して、各定数の文字列表現を取得できます。toString()
BloodTest.BBB.toString()
最初の前提は、テスト タイプごとに特定のロジックがあることだったので、ロジック (および必要なプロパティ) も enum 自体または enum 定数にカプセル化することをお勧めします。例えば:
public enum BloodTest {
AAA(10) {
@Override
public boolean isRequired(MedicalRecord medicalRecord) {
return medicalRecord.includes("someDisease");
}
},
BBB(15) {
@Override
public boolean isRequired(MedicalRecord medicalRecord) {
return ! medicalRecord.hasTakenBloodTestsLately();
}
},
CCC(20) { // ... also implements the abstract method and so on
private final int threshold;
private BloodTest(int threshold) {
this.threshold = threshold;
}
public boolean hasPassed(int value) {
return value <= threshold;
}
public abstract boolean isRequired(MedicalRecord medicalRecord);
// ... same as above
}
some への参照を取得したら、対応するメソッドをing なしで呼び出し、ロジックをクライアント コードに分散させることでBloodTest
、その特定のテストに合格したかどうかを確認できます。switch
BloodTest bloodTest = BloodTest.valueOf(someString); // someString can be "AAA", "BBB" or "CCC"
// no matter which constant this is, you use it as an object and rely on polymorphism
if (bloodTest.hasPassed(someValue)) { // ... do something
Q2: あなたの質問 2 種類の「質問」は、列挙型の実際の必要性に関する私の最初の仮定です。まだ知らない血液検査を動的に処理する必要がある場合は、列挙型を使用できません。
言い換えれば、コードに各血液検査を処理するためのブロックがまったくない場合、列挙型はユースケースにとって非常に悪い選択ですswitch
。if/else if
switch
ただし、そうである場合は、コードをリファクタリングして、上記の例のように/if
ブロックではなく列挙型自体にロジックを含めることをお勧めします。さらに、ケースswitch
があるdefault
場合 (またはif
最終ブロックがある場合)、これは、たとえば定数をフォールバックとしてelse
追加することにより、列挙型自体でモデル化できます。DEFAULT