Dra*_*mon 12 java enums coding-style
在java <1.5中,常量将像这样实现
public class MyClass {
public static int VERTICAL = 0;
public static int HORIZONTAL = 1;
private int orientation;
public MyClass(int orientation) {
this.orientation = orientation;
}
...
Run Code Online (Sandbox Code Playgroud)
你会像这样使用它:
MyClass myClass = new MyClass(MyClass.VERTICAL);
Run Code Online (Sandbox Code Playgroud)
现在,在1.5中显然你应该使用枚举:
public class MyClass {
public static enum Orientation {
VERTICAL, HORIZONTAL;
}
private Orientation orientation;
public MyClass(Orientation orientation) {
this.orientation = orientation;
}
...
Run Code Online (Sandbox Code Playgroud)
现在你会像这样使用它:
MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL);
Run Code Online (Sandbox Code Playgroud)
我觉得有点难看.现在我可以轻松添加几个静态变量:
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;
}
...
Run Code Online (Sandbox Code Playgroud)
现在我可以再次这样做:
MyClass myClass = new MyClass(MyClass.VERTICAL);
Run Code Online (Sandbox Code Playgroud)
具有所有类型安全的枚举功能.
这是好风格,坏风格还是两者都没有.你能想到更好的解决方案吗?
更新
Vilx-是第一个突出我觉得我缺少的东西 - 这个enum应该是一流的公民.在java中,这意味着它在包中获得了自己的文件 - 我们没有名称空间.我曾经以为这会有点重量级,但实际上已经做到了,它绝对是正确的.
Yuval的答案很好,但它并没有真正强调非嵌套枚举.此外,对于1.4 - JDK中有很多使用整数的地方,我真的在寻找一种方法来发展这种代码.
Yuv*_*dam 27
你太复杂了.让我们一起来吧.
在Java 1.5之后,你应该使用Java Enum类:
public enum Color
{
BLACK, WHITE;
}
Run Code Online (Sandbox Code Playgroud)
Pre Java 1.5你应该使用类型安全的枚举模式:
public class Color
{
public static Color WHITE = new Color("white");
public static Color BLACK = new Color("black");
private String color;
private Color(String s)
{
color = s;
}
}
Run Code Online (Sandbox Code Playgroud)
在这两种方式中你都这样称呼它:
drawBackground(Color.WHITE);
Run Code Online (Sandbox Code Playgroud)
具体来说,关于你的问题.这是代码风格的问题,但我认为首选方法是将枚举保存在各自的类中.特别是一旦他们开始让自己的方法,如getName(),getId()等...把它看成是同样的困境为常规类与匿名类,一旦类开始变得混乱,现在是时候把它搬出来自己的文件.
你知道吗,你可以导入Orientation并说出来
MyClass myClass = new MyClass(Orientation.VERTICAL);
Run Code Online (Sandbox Code Playgroud)
?
不了解 Java,但在 .NET 中,好的做法是将枚举与使用它们的类并行放置,即使它仅由一个类使用。也就是说,你会写:
namespace Whatever
{
enum MyEnum
{
}
class MyClass
{
}
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以使用:
MyClass c = new MyClass(MyEnum.MyValue);
Run Code Online (Sandbox Code Playgroud)