在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;
}
...
并且您可以这样使用它:
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);
具有枚举的所有类型安全性。
这是好风格还是坏风格?您能想到更好的解决方案吗?
更新资料
Vilx-是第一个强调我感到失踪的人-枚举应该是一等公民。在Java中,这意味着它将在包中获取自己的文件-我们没有名称空间。我本来以为这会有点重量级,但是实际上,确实感觉很对。
Yuval的回答很好,但是并没有真正强调非嵌套枚举。另外,对于1.4-JDK中有很多使用整数的地方,我确实在寻找一种方法来发展这种代码。
在第一个代码块中,您打算为每个变量赋予不同的值,对吗?
您实际上是否需要MyClass类做更多的事情,而不仅仅是不同的Orientation可以做的事情?
你太复杂了。让我们把它们放在一起。
在Java 1.5之后,您应该使用Java Enum类:
public enum Color
{
BLACK, WHITE;
}
在Java 1.5之前的版本中,您应该使用类型安全的Enum模式:
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;
}
}
在两种方式中,您都这样称呼它:
drawBackground(Color.WHITE);
具体来说,关于您的问题。这是代码风格的问题,但是我认为首选的方法是将枚举保留在它们各自的类中。尤其是一旦他们开始获得自己的方法(例如getName(),getId()等)时,就将其视为与普通类和匿名类相同的难题,一旦类开始变得混乱起来,就该移动它了导出到自己的文件。
你知道你可以导入方向说
MyClass myClass = new MyClass(Orientation.VERTICAL);
?
好点子。 是的,我做到了,但这仍然意味着调用代码中的更多详细信息(它增加了一个导入行)。 我的动机是使调用代码更短,更整洁。
我,对不起,老兄。 我的意思是,我热爱Java以及所有语言,但较短的语言从来没有像现在这样优先。
更短? 是什么...而不是一遍又一遍地而不是一遍又一遍地写MyClass? 那对我来说简直就是干净。
不了解Java,但是在.NET中,好的做法是将枚举与使用它们的类并行,即使它仅由一个类使用。也就是说,您将编写:
namespace Whatever
{
enum MyEnum
{
}
class MyClass
{
}
}
因此,您可以使用:
MyClass c = new MyClass(MyEnum.MyValue);
在一类重要的情况下,应使用常量而不是enum。这是您要使用常量进行算术运算或将它们与数值进行比较的时候。然后,您真的需要把东西变成int,long或double。
相反,如果使用事物进行算术或数值比较永远没有意义,那么该事物应该是一个对象而不是原始数字,因此enum会更合适。
我同意您很有创造力,但是我认为这不是一个实际的解决方案,我认为您只是将"丑陋"转移到了代码的不同部分。如果除了"垂直"和"水平"之外,您还将拥有DIAGONAL,AA,BB,CC等,该怎么办?您是否需要通过键入每个静态常量来进行复制?您认为MyClass.Orientation.VERTICAL难看的味道可能是与您个人有关?
我同意Ive刚刚改变了丑陋性,但是我总是稍微喜欢它在调用代码中而不是在调用代码中。 它绝对是个人的,我什至不确定我是否喜欢替代方案,这就是为什么我要提出观点。 我得出的结论是,单独上课最好。
您还可以在MyClass上使用两个静态方法:
MyClass.Vertical() : MyClass
MyClass.Horizontal() : MyClass
这些将返回带有正确的枚举集的新实例。
这取决于枚举可以采用多少个值。在您的示例中,只有两个,我只使用布尔值。如果枚举仅由您编写的代码使用,而不必与许多其他代码进行交互,则可能不需要类型安全性。但是,如果采用"公开"方法,则我肯定会使用枚举,并将枚举放入其自己的文件中。
您有一个要点,但是使用枚举是一个自我描述,而不是布尔值。
但是,如果只是将其传递给函数,则可以使签名公开MyClass(boolean isVertical)。 那是我唯一会用的情况。