Как вы, возможно, знаете, некоторые люди объявляют синглтоны с 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);
Какой интерес объявить открытый метод, если он не может быть вызван без прохождения через общий интерфейс?
Наверное, поэтому я не вижу синтаксиса, чтобы можно было объявить интерфейс только для одного из экземпляров Enum.
Edit:
Кажется, что экземпляры 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.getFormattedPrice (33f) типобезопасным способом, поскольку WITH_TAXES не был бы реальным EnumPriceType, но это было бы лишь подклассом EnumPriceType со своим собственным интерфейса и, вызывая WITH_TAXES.getFormattedPrice (33f) с жестко запрограммированным WITH_TAXES, вы узнаете при компиляции, какой дочерний EnumPriceType вы вызываете.
Итак, мой вопрос: есть ли причины, по которым это невозможно? Или это просто еще не сделано?