Если у меня есть объект перечисления, считается ли он примитивным или ссылочным?
Явными перечислениями считаются примитивные или ссылочные типы?
Ответ 1
Это ссылочный тип.
В отличие от многих языков, в которых enum
представляет собой набор интегральных констант, перечисления Java являются неизменяемыми экземплярами объектов. Вы можете получить числовое значение экземпляра enum, вызвав ordinal()
.
Вы даже можете добавить своих собственных членов в класс enum, например:
public enum Operation {
PLUS { double eval(double x, double y) { return x + y; } },
MINUS { double eval(double x, double y) { return x - y; } },
TIMES { double eval(double x, double y) { return x * y; } },
DIVIDE { double eval(double x, double y) { return x / y; } };
// Do arithmetic op represented by this constant
abstract double eval(double x, double y);
}
//Elsewhere:
Operation op = Operation.PLUS;
double two = op.eval(1, 1);
Ответ 2
Работа с перечислениями на самом деле не слишком отличается от того, как они использовались до их введения с Java 5:
public final class Suit {
public static final Suit CLUBS = new Suit();
public static final Suit DIAMONDS = new Suit();
public static final Suit HEARTS = new Suit();
public static final Suit SPADES = new Suit();
/**
* Prevent external instantiation.
*/
private Suit() {
// No implementation
}}
Путем создания экземпляров различных мастей при загрузке классов обеспечивается, что они будут взаимоисключающими, а частный конструктор гарантирует, что никаких дополнительных экземпляров не будет создано.
Они были бы сопоставимы либо через ==, либо равны.
Перехват Java 5 работает примерно так же, но с некоторыми необходимыми функциями для поддержки сериализации и т.д.
Я надеюсь, что этот фон проливает некоторый дополнительный свет.
Ответ 3
В этой статье по существу показано, как реализованы перечисления, и, как говорит SLaks, это ссылки.
Ответ 4
Перечисления - это ссылочные типы, поскольку они могут иметь методы и могут быть выполнены из командной строки, если они имеют основной метод.
Смотрите пример "Планета" из Sun/Oracle
http://download.oracle.com/javase/tutorial/java/javaOO/enum.html