java - Java 中的嵌套枚举?

标签 java enums

我想为我的 Web 应用程序中可用的各种 ajax 服务定义一些枚举,例如:

Enum Service
{
    REGISTER,
    LOGIN,
    NEWS,
    FAQ
}

但是,这些枚举中的每一个也会有特定的状态,如失败、加载等。所以我希望能够使用 REGISTER.LOADEDLOGIN.LOADED 等等,在我的事件总线上启动事件。但是每个状态枚举必须是唯一的。即 Register.LOADED 必须不同于 FAQ.LOADED,等等。

编辑:此外,我必须能够将所有状态存储在同一 HashMap 中,例如 Register.LOADEDLogin.LOADED 必须可存储在同一 HashMap 中。并且父服务枚举,即 LOGIN、REGISTER 等也必须可存储在同一个 HashMap 中。

完成此任务的最佳方法是什么?

最佳答案

在 OP 的一些评论之后,我更新了我的代码。使用语法变得丑陋,在 switch 中可能效果不佳 block ,但我相信这实现了 OP 正在寻找的东西:

import java.util.*;

public class HelloWorld
{
    public static void main(String []args)
    {
        // Different services are not equal
        System.out.println(Service.REGISTER + "==" + Service.LOGIN + " :: " + Service.REGISTER.equals(Service.LOGIN));
        // Same service is equal
        System.out.println(Service.REGISTER + "==" + Service.REGISTER + " :: " + Service.REGISTER.equals(Service.REGISTER));
        // Even after changing the state
        Service tmp = Service.REGISTER;
        Service.REGISTER.setState(Service.ServiceState.State.FAILED);
        System.out.println(Service.REGISTER + "==" + tmp + " :: " + Service.REGISTER.equals(tmp));
        
        Service.REGISTER.setState(Service.ServiceState.State.LOADED);
        
        // Different service, same state is not equal
        System.out.println(Service.REGISTER + "." + Service.REGISTER.state + "==" + Service.LOGIN + "." + Service.LOGIN.state + " :: " + Service.REGISTER.state.equals(Service.LOGIN.state));
        
        // Same service, same state is equal (even when changing state around)
        Service.ServiceState.State temp = Service.REGISTER.getState();
        Service.REGISTER.setState(Service.ServiceState.State.LOADED);
        System.out.println(Service.REGISTER + "." + Service.REGISTER.state + "==" + tmp + "." + temp + " :: " + temp.equals(Service.REGISTER.getState()));
        
        // Same service, different state is not equal
        Service.REGISTER.setState(Service.ServiceState.State.FAILED);
        System.out.println(Service.REGISTER + "." + Service.REGISTER.state + "==" + tmp + "." + temp + " :: " + temp.equals(Service.REGISTER.getState()));
        
        // Both service and state can be used as map keys
        Map<Service, String> map = new HashMap<Service, String>();
        Map<Service.ServiceState.State, String> map2 = new HashMap<Service.ServiceState.State, String>();
    }
}

enum Service
{
    REGISTER(),
    LOGIN(),
    NEWS(),
    FAQ();

    public ServiceState state;

    Service()
    {
        this.state = new ServiceState();
    }
    
    public void setState(ServiceState.State s)
    {
        state.state = s;
    }
    
    public ServiceState.State getState() { return state.state; }

    public static class ServiceState
    {
        public enum State
        {
            LOADED,
            FAILED
        }
        
        public State state = State.LOADED;
        
        public ServiceState(){}
        
        public String toString() { return state.toString(); }
        
        public int hashCode()
        {
            return state.hashCode();
        }
        
        public boolean equals(Object obj)
        {
            return state.equals(obj);
        }
    }
}

输出:

REGISTER==LOGIN :: false
REGISTER==REGISTER :: true
REGISTER==REGISTER :: true
REGISTER.LOADED==LOGIN.LOADED :: false
REGISTER.LOADED==REGISTER.LOADED :: true
REGISTER.FAILED==REGISTER.LOADED :: false

原答案:

用你想要的语法不太可能,但 Java 枚举基本上只是类的另一个名字。 (事实上​​ ,一旦编译,它们扩展 java.lang.Enum<E extends Enum<E>> 的类)

public class HelloWorld
{
    public static void main(String []args)
    {
        Service a = Service.REGISTER;
        a.state = Service.ServiceState.LOADED;
        System.out.println(a);
    }
}

enum Service
{
    REGISTER(),
    LOGIN(),
    NEWS(),
    FAQ();
    
    public ServiceState state;
    
    Service()
    {
        this.state = ServiceState.LOADED;
    }
    
    public String toString()
    {
        return super.toString() + "." + state.toString();
    }
    
    public enum ServiceState
    {
        LOADED,
        FAILED
    }
}

输出:

REGISTER.LOADED

关于java - Java 中的嵌套枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783046/

相关文章:

java - 使用 for 循环和 if 语句以行/表格式打印字符 (Ascii)?

java - 如果同一个实例已经在运行,如何关闭 javax 应用程序?

c++ - std::set 用作静态模板化成员变量

.net - 枚举应该位于 MVC 项目结构中的什么位置?

c# - 如何检查是否设置了标志组合的任何标志?

java - 非抽象类中的抽象方法

java - 使用元模型区分大小写条件的 JPA 2 Criteria API

c++ - 将枚举与 std::map<> 混合

c++ - 如何将枚举导入 C++ 中的不同命名空间?

java - Android studio,ArrayList 无法正确显示 ListView 中的项目