java enums: концептуальное сомнение - PullRequest
1 голос
/ 12 января 2011

Рассмотрим перечисление:

enum day{ MONDAY, TUESDAY};

Что такое понедельник, вторник.В документации Sun написано, что они являются полями специального типа enum.Но если это так, почему мы можем это сделать:

day d=day.MONDAY  

Я имею в виду, как мы можем присвоить константу класса переменной класса.

Ответы [ 4 ]

5 голосов
/ 12 января 2011

Вы присваиваете значение поля новому полю.Это ничем не отличается от:

public class Constants {
    public static final String FOO = "foo";
}

public class Other {
    String x = Constants.FOO;
}

Перечисление - это просто еще один ссылочный тип, за исключением того, что оно имеет некоторую библиотечную поддержку, и единственные экземпляры перечисления (оставляя в стороне некоторые ненормальные хаки) - это те, на которые ссылаютсяк значениям перечисления.

4 голосов
/ 12 января 2011

Как и предложение @ Джона, но более конкретно ...

РЕДАКТИРОВАТЬ: Я добавил некоторые из методов, которые Enum предоставляет для вас.Надеюсь, это поможет ...

public class Day /* extends Enum */ {
    public static final Day MONDAY = new Day("MONDAY", 0);
    public static final Day TUESDAY = new Day("TUESDAY", 1);

    private static final Day[] values = { MONDAY, TUESDAY };
    private static final Map<String, Day> valueOfMap = new HashMap();

    public static Day[] values() { return values.clone(); }
    public static Day valueOf(String name) {
        Day day = valueOfmap.get(name);
        if(day == null) throw new IllegalArgumentException(name);
        return day;
    }

    private final String name;
    private final int ordinal;

    private Day(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
        valueOfMap.put(name, this);
    }
    public String name() { return name; }
    public int ordinal() { return ordinal; }
    public String toString() { return name; }
}

public class Other {
    Day day = Day.MONDAY;
}

Возможно, это не то, как это реализовано, а то, как вы могли бы это реализовать.

1 голос
/ 12 января 2011

Вы всегда можете присвоить константу класса переменной класса. Рассмотрим:

public class ConstantClass
{
    public static String constantString = "I am a constant";
}

include ConstantClass;

public class OtherClass
{
    private String regularVariable;

    public OtherClass()
    {
        regularVariable = ConstantClass.constantString;
    }
}

Как и для обычного класса, это также относится к типу enum.

0 голосов
/ 12 января 2011

MONDAY и TUESDAY являются экземплярами класса, определенного в операторе enum.

Вот пример:

enum dow
{
    MONDAY(1),
    TUESDAY(2);

    private int value;

    private dow(int value)
    {
        this.value = value;
    }

    public int getValue()
    {
        return value;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...