2011-01-12 2 views
1

Рассмотрим перечисление:Java перечислений: концептуальные сомнения

enum day{ MONDAY, TUESDAY}; 

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

day d=day.MONDAY 

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

ответ

4

предложение как @ Джон, но более ... специфический

EDIT: Я добавил некоторые из методов 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; 
} 

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

5

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

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

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

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

+0

@ Джон: в перечислениях, кажется, что мы делаем Константы х = Constants.FOO – TimeToCodeTheRoad

+0

@TimeToCodeTheRoad: Это просто потому, что тип переменной происходит с тем же как тип, используемый для получения значения. Представьте себе, если String имеет постоянное поле EMPTY - было бы замечательно написать 'String x = String.EMPTY', не так ли? –

+0

@Jon: Кажется, что сообщение Питера очень точно. Это сообщение после твоего – TimeToCodeTheRoad

1

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

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

include ConstantClass; 

public class OtherClass 
{ 
    private String regularVariable; 

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

Как и в случае с обычным классом, это также относится к типу перечисления.

0

ПОНЕДЕЛЬНИК И ВТОРНИК - это экземпляры класса, которые определяются оператором перечисления.

Вот пример:

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

    private int value; 

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

    public int getValue() 
    { 
     return value; 
    } 
}
+0

Точнее, ПОНЕДЕЛЬНИК и ВТОРНИК являются полем типа перечисления; их значения - * ссылки * на экземпляры типа. Мне всегда нравится различать ссылки и примеры :) –

Смежные вопросы