Перечисления – это очень распространенное понятие. Конечно, он существует и в Java, и в C#. Однако перечисления Java и C# не обладают одинаковыми возможностями. Цель этого поста в блоге – показать их различия.
В Java перечисления очень похожи на обычные классы: они могут реализовывать интерфейсы и иметь методы. Однако они не могут наследовать другие классы или быть созданы явно. Их можно рассматривать как окончательные
классы (или запечатанные
классы в C#), которые уже наследуют виртуальный класс “enum”, имеют только частные конструкторы и набор предопределенных экземпляров (значения перечисления).
Например, давайте возьмем пример кодов состояния HTTP. На Java можно написать такой код:
enum HttpStatus implements Comparable{ OK(200), SERVER_ERROR(500), NOT_FOUND(404); private final int code; HttpStatus(int code) { this.code = code; } // This is a regular instance method int code() { return code; } // This is the implementation of the Comparable interface @Override int compareTo(HttpStatus o) { // Http statuses will be sorted by status code return Integer.compare(code, o.code); } }
HttpStatus status = HttpStatus.OK; // The 'code' method can be invoked like any other method int code = status.code();
В C# перечисления – это просто замаскированные целые числа. Предыдущий фрагмент может быть смоделирован в C# только потому, что атрибут code
имеет значение int
. В противном случае было бы очень сложно вести себя так же:
enum HttpStatus { // int value of the enum can be forced to a specific value OK = 200, NOT_FOUND = 404, SERVER_ERROR = 500 }
HttpStatus status = HttpStatus.OK; // The enum can be casted to an int to get its value int code = (int) status;
Подводя итог, можно сказать, что перечисления Java намного мощнее, чем их аналоги на C#. Я часто использую эти функции, когда пишу Java-код и я думаю, что мне было бы их не хватать, если бы мне приходилось ежедневно писать код на C#.
Оригинал: “https://dev.to/rnowif/c-for-the-java-developer-enums-2864”