替代在Java 1.4中,以枚举(Alternative to enum in Java 1.4)

2019-06-24 01:31发布

由于Java 1.4没有枚举我正在做这样的事情:

public class SomeClass {
     public static int SOME_VALUE_1 = 0;
     public static int SOME_VALUE_2 = 1;
     public static int SOME_VALUE_3 = 2;

     public void receiveSomeValue(int someValue) {
            // do something
     }
 }

receiveSomeValue的调用者应该通过一个3个这些值,但他可以通过任何其他INT。 如果它是一个枚举调用者只能通过一个有效的价值。

如果receiveSomeValue抛出InvalidValueException?

- 什么是良好的选择到Java 5个枚举?

Answer 1:

最好预先1.5使用的是类型安全枚举模式在书中最好的形容有效的Java通过乔希布洛赫 。 然而,它有一定的局限性,尤其是当你在处理不同的类加载器,系列化等特点。

您还可以看看在Apache Commons Lang中的项目和espacially枚举类,像约翰写。 正是这种模式的实现和支持创建自己的枚举。



Answer 2:

我通常会创建我称之为不变类,像这样一些事情:

public class MyConstant 
{
  public static final MyConstant SOME_VALUE = new MyConstant(1);
  public static final MyConstant SOME_OTHER_VALUE = new MyConstant(2);
  ...

  private final int id;


  private MyConstant(int id)
  {
    this.id = id;
  }

  public boolean equal(Object object) 
  {
    ...
  }

  public int hashCode() 
  {
    ...
  }
}

其中, equalshashCode正在使用的id



Answer 3:

阿帕奇共享郎有一个枚举类是工作得很好,非常好介绍什么的Java 5枚举提供。



Answer 4:

如果应用程序代码将使用大量的枚举的,那么我宁愿以下解决方案,我在我的应用程序使用了。

基类

public class Enum {
    protected int _enumValue;
    protected Enum(int enumValue) {
        this._enumValue = enumValue;
    }

    public int Value() {
        return this._enumValue;
    }
}

然后,您的枚举将遵循这些模式

实际枚举

public class DATE_FORMAT extends Enum {
    public static final int DDMMYYYY = 1;
    public static final int MMDDYYYY = 2;
    public static final int YYYYMMDD = 3;

    public DATE_FORMAT(int enumValue) {
        super(enumValue);
    }
}

和你的代码可以如下消耗此枚举

String getFormattedDate(DATE_FORMAT format) {

    String sDateFormatted = "";

    switch (format.Value()) {

        case DATE_FORMAT.DDMMYYYY : 
            break;
        case DATE_FORMAT.MMDDYYYY :
            break;
        case DATE_FORMAT.YYYYMMDD :
            break;
        default:
            break;
    }

    return sDateFormatted;
}

来电者可以使用该功能

void callerAPI() {
    DATE_FORMAT format = new DATE_FORMAT(DATE_FORMAT.DDMMYYYY);

    String sFormattedDate = getFormattedDate(format);

}

这又是不是针对任何整数值intitializing衍生枚举对象的充分证明。 然而,它可以提供良好的语法指导非枚举环境中工作。



文章来源: Alternative to enum in Java 1.4