java使用常量编码_关于编码样式:在Java中应始终使用枚举而不是常量

在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)。 那是我唯一会用的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值