В java <1.5 константы будут реализованы следующим образом </p>
public class MyClass {
public static int VERTICAL = 0;
public static int HORIZONTAL = 1;
private int orientation;
public MyClass(int orientation) {
this.orientation = orientation;
}
...
и вы бы использовали его так:
MyClass myClass = new MyClass(MyClass.VERTICAL);
Теперь, в 1.5, очевидно, вы должны использовать перечисления:
public class MyClass {
public static enum Orientation {
VERTICAL, HORIZONTAL;
}
private Orientation orientation;
public MyClass(Orientation orientation) {
this.orientation = orientation;
}
...
и теперь вы будете использовать его так:
MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL);
Который я нахожу немного безобразным. Теперь я могу легко добавить пару статических переменных:
public class MyClass {
public static Orientation VERTICAL = Orientation.VERTICAL;
public static Orientation HORIZONTAL = Orientation.HORIZONTAL;
public static enum Orientation {
VERTICAL, HORIZONTAL;
}
private Orientation orientation;
public MyClass(Orientation orientation) {
this.orientation = orientation;
}
...
И теперь я могу сделать это снова:
MyClass myClass = new MyClass(MyClass.VERTICAL);
Со всеми типобезопасными перечислениями.
Это хороший стиль, плохой стиль или нет. Можете ли вы придумать лучшее решение?
Update
Vilx - был первым, кто выдвинул на первый план то, что я чувствую, что я скучал - что enum должен быть первоклассным гражданином. В Java это означает, что он получает свой собственный файл в пакете - у нас нет пространств имен. Я думал, что это будет немного тяжеловесно, но на самом деле, это определенно кажется правильным.
Ответ Ювала хорош, но он не особо подчеркивал не вложенное перечисление. Кроме того, что касается 1.4 - в JDK есть много мест, где используются целые числа, и я действительно искал способ развить такой код.