我想为我的 Web 应用程序中可用的各种 ajax 服务定义一些枚举,例如:
Enum Service
{
REGISTER,
LOGIN,
NEWS,
FAQ
}
但是,这些枚举中的每一个也会有特定的状态,如失败、加载等。所以我希望能够使用 REGISTER.LOADED
、LOGIN.LOADED
等等,在我的事件总线上启动事件。但是每个状态枚举必须是唯一的。即 Register.LOADED
必须不同于 FAQ.LOADED
,等等。
编辑:此外,我必须能够将所有状态存储在同一 HashMap 中,例如 Register.LOADED
和 Login.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/