Использование добавления функций / полей для перечисления случаев в Java, кроме переопределения?

Jilocasin:

Случайно я только что обнаружил, что компилятор 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] Удалить.

Отредактировано в
0

я говорю два предложения

0обзор
Войти в системуУчаствуйте в комментариях

Статьи по теме

TOP список

  1. 1

    Распределение Рэлея Curve_fit на Python

  2. 2

    Flutter: Unhandled Exception: FileSystemException: Creation failed, path = 'Directory: '' (OS Error: Read-only file system, errno = 30)

  3. 3

    В типе Observable <unknown> отсутствуют следующие свойства из типа Promise <any>.

  4. 4

    Bogue étrange datetime.utcnow()

  5. 5

    Строка не читается после новой строки из .env в nodeJs

  6. 6

    Одновременная печать двух этикеток с ZPL

  7. 7

    Как получить список индексов всех значений NaN в массиве numpy?

  8. 8

    Как добавить Swagger в веб-API с поддержкой OData, работающий на ASP.NET Core 3.1

  9. 9

    discord.py: on_message (message) не работает несколько дней

  10. 10

    Passing Core Data objects from UITableViewCell to another View Controller

  11. 11

    Django Heroku - ModuleNotFoundError: нет модуля с именем django_heroku

  12. 12

    Ipython использует% store magic для получения динамического имени

  13. 13

    Не удается запустить компилятор cl

  14. 14

    Почему actionPerformed выполняется двумя потоками?

  15. 15

    Предотвращение переноса строк в блоки кода с помощью jekyll, kramdown и rouge

  16. 16

    Можно ли использовать автономные бегуны GitHub Actions без песочницы?

  17. 17

    Почему бы не выдать ошибку ERROR в тесте Jasmine?

  18. 18

    как воспроизводить несколько видео одно за другим в VideoView в android

  19. 19

    How to click an array of links in puppeteer?

  20. 20

    Запрос Google Таблиц по дате и сгруппировать отсутствующие данные

  21. 21

    Не могу понять, почему Wix не перезаписывает старую версию

популярныйтег

файл