Случайно я только что обнаружил, что компилятор Java 1.8 допускает следующий синтаксис:
enum AnimalType {
DOG {
@Override
public String toString() {
return "I am a dog";
}
},
CAT {
@Override
public String toString() {
return "I am a cat";
}
public void doCatThings() {
// ...
}
},
}
Переопределение по toString()
отдельности работает отлично. Вызов AnimalType.DOG
результатов в строке "Я собака".
Кроме этого, я не смог найти никакой информации о том, для чего можно использовать эту настройку перечисления. Обратите внимание на другой публичный метод для случая CAT
. При определении любого другого общедоступного метода или поля кажется, что к нему все равно нельзя получить доступ извне.
Так в чем же дело? Это что-то, что является технически правильным синтаксисом, но бессмысленным?
toString
наследуется от Object, но поведение все еще полиморфно: DOG и CAT «печатают» себя по-разному. Теперь ваши собственные пользовательские методы (например, sound()
в следующем примере) будут иметь больше смысла, если вы будете использовать абстрактный метод на уровне AnimalType
определения enum:
enum AnimalType {
DOG {
@Override
public String toString() {
return "I am a dog";
}
@Override
public void sound() {
System.out.println("Meowww");
}
},
CAT {
@Override
public String toString() {
return "I am a cat";
}
@Override
public void sound() {
System.out.println("Woof, I'm a barking dog");
}
};
abstract void sound();
}
Теперь вы можете добавить полиморфное пользовательское поведение в перечисление и использовать его, не зная фактического животного:
public class SampleClass {
public static void doSound(AnimalType animal) {
...
animal.sound();
}
}
// usage:
SampleClass.doSound(AnimalType.DOG);
Фактическое использование может варьироваться, вне моей головы, вы можете реализовать конечный автомат, анализ, если перечисления являются токенами, вычисления, если перечисления являются геометрическими фигурами (например, вычислить объем трехмерной фигуры), и что нет. Это инструмент для Java-программистов, как и многие другие. Использовать его мудро :)
Эта статья взята из Интернета, укажите источник при перепечатке.
Если есть какие-либо нарушения, пожалуйста, свяжитесь с[email protected] Удалить.
я говорю два предложения