ご存知かもしれませんが、Enum が 1 のインスタンスでシングルトンを宣言する人もいます。これは、JVM が処理する並行性の問題のない単一のインスタンスが常に存在することを保証するためです...
では、複数のインスタンスを持つ Enum はどうでしょうか? Enum のようなものは、共通のインターフェースを共有するシングルトンの一種の順序付けられたセットであると言えますか? なんで?
public enum EnumPriceType {
WITH_TAXES {
@Override
public float getPrice(float input) {
return input*1.20f;
}
public String getFormattedPrice(float input) {
return input*1.20f + " €";
}
},
WITHOUT_TAXES {
@Override
public float getPrice(float input) {
return input;
}
},
;
public abstract float getPrice(float input);
public static void main(String[] args) {
WITH_TAXES.getFormattedPrice(33f);
}
}
このコードでは、なぜこれが機能しないのか: WITH_TAXES.getFormattedPrice(33f); 共通インターフェイスを通過しないと呼び出すことができない場合、パブリック メソッドを宣言する意味は何ですか? これが、列挙型のインスタンスの 1 つだけに対してインターフェイスを宣言できる構文が表示されない理由だと思います。
編集:
enum インスタンスは特別な種類の匿名クラスのようです。したがって、そのメソッドを呼び出すことができない理由を理解しています。
私の質問はちょっと関連しています:匿名クラスがインターフェイスを実装できないのはなぜですか (既に実装されている可能性のあるインターフェイスに加えて!)
なぜそれができないのか、私は完全に理解しています:
Vehicle veh = new Vehicle() {
public String getName() {
return "toto";
}
};
veh.getName();
(ここの getName はオーバーライドではありません)
なぜ私が理解できないのは、匿名クラスでそれができない理由です:
Runnable veh = new Vehicle() implements Runnable {
@Override
public void run() {
System.out.println("i run!");
}
};
veh.run();
または、同じ結果になるもの。考えてみてください。匿名クラスを使用しない場合は、 Vehicle クラスを完全に拡張して、そのサブクラスに必要な他のインターフェイスを実装させることができます...
WITH_TAXES は実際の EnumPriceType ではなく、独自のインターフェイスを備えた EnumPriceType のサブクラスであるため、可能な場合はタイプセーフな方法で WITH_TAXES.getFormattedPrice(33f) を呼び出すことができると確信しています。ハードコーディングされた WITH_TAXES を使用して WITH_TAXES.getFormattedPrice(33f) を呼び出すと、コンパイル時にどの EnumPriceType 子を呼び出しているかがわかります。
だから私の質問は:これが不可能な理由はありますか? それともまだやってないだけ?