解释JAVA中的ENUM定义

时间:2015-11-03 19:18:02

标签: java enums

所有

我在第一天阅读团队的代码(那个人写下了这个......):

有一个枚举定义让我非常困惑:

/**
 * Enum defines the processing stages and the order
 *
 */
public enum ProcessStage {

    /*
     * Individual stages in the process.
     * Order of processing is based on the order of listing.
     */
    EXTRACT("Extraction", "EXTRACTED", "EXTRACTION_FAILED"), 
    ROUTE("Routing", "ROUTED", "ROUTE_FAILED"), 
    PUBLISH("Publishing", "PUBLISHED", "PUBLISH_FAILED");

    private String detailedName;
    private String successState;
    private String failedState;

    private ProcessStage(String detailedName, String successState, String failedState) {
        this.detailedName = detailedName;
        this.successState = successState;
        this.failedState = failedState;
    }
    public String getSuccessState() {
        return successState;
    }
    public String getFailedState() {
        return failedState;
    }

    /**
     * Factory method to provide the ProcessStage from its success or failed state value stored in DB.
     * @param state
     * @return ProcessStage
     */
    public static ProcessStage getProcessStage(String state) {
        for(ProcessStage ps: ProcessStage.values()) {
            if(ps.getSuccessState().equals(state) || ps.getFailedState().equals(state)) {
                return ps;
            }
        }

        return null;
    }

    public String toString() {
        return detailedName;
    }

}

我想知道是否有人给我一些关于如何阅读它的简单介绍(比如它使用什么样的语法)?最困惑的部分是:

    EXTRACT("Extraction", "EXTRACTED", "EXTRACTION_FAILED"), 
    ROUTE("Routing", "ROUTED", "ROUTE_FAILED"), 
    PUBLISH("Publishing", "PUBLISHED", "PUBLISH_FAILED");

我不太明白这意味着什么,以及如何使用它。

为什么在其中定义了很多方法以及如何将方法与枚举变量一起使用?

由于

2 个答案:

答案 0 :(得分:2)

Enum

  

枚举声明定义了一个类(称为枚举类型)。枚举   类体可以包括方法和其他字段。编译器   在创建枚举时自动添加一些特殊方法。

枚举是特殊类型的类。我们可以在这些地方使用枚举,而不是使用常规类创建单例模式或创建常量(如WeekDays)。这里

EXTRACT("Extraction", "EXTRACTED", "EXTRACTION_FAILED"), 

此处EXTRACT是枚举常量,意味着它是类的实例 ProcessStage以及所有其他枚举常量(ROUTE,PUBLISH)。枚举的所有costants都是唯一对象,这意味着它们是在jvm中创建的单例实例,enum确保实例是唯一的。您无需为创建单例模式付出额外的努力。

上面的代码不仅是声明,它还是使用三个String参数调用构造函数来创建实例。

  private ProcessStage(String detailedName, String successState, String failedState) {
        this.detailedName = detailedName;
        this.successState = successState;
        this.failedState = failedState;
    }
  

为什么里面定义了很多方法?

因为它也是一个类,所以它可以像任何其他类一样使用方法。但限制是,它不能被继承,因为内部枚举扩展了类Enum<E extends Enum<E>>类。

  

如何使用enum变量的方法?

EXTRACT.getFailedState() //returns "EXTRACTION_FAILED"

答案 1 :(得分:1)

请记住,在没有看到更多代码的情况下,我无法确切知道这个特定的枚举用于什么。 所以,假设我们在某个地方有一个方法,一个过程通过。

public void doSomething(Process process) {}

现在,我们假设此方法的目的是检查进程的状态,然后根据该结果执行一些逻辑。这需要做类似以下的事情

public void doSomething(Process process) {
    if(ProcessStage.EXTRACT.equals(process.getStage()) {
        //do something here...you will have access to the methods within
        //the enum
    }
}

不知道更多,这就是我能给你的全部。我希望这能让你更好地理解这个枚举正在做什么