Java中的嵌套枚举?
发布时间:2020-12-14 05:42:23 所属栏目:Java 来源:网络整理
导读:我想为我的Web应用程序中提供的各种ajax服务定义一些枚举,例如: Enum Service{ REGISTER,LOGIN,NEWS,FAQ} 但是,这些枚举中的每一个都会有一个状态,如Failed,Loaded等.所以我希望能够使用REGISTER.LOADED,LOGIN.LOADED等来激活我的事件总线上的事件.但是每个
我想为我的Web应用程序中提供的各种ajax服务定义一些枚举,例如:
Enum Service { REGISTER,LOGIN,NEWS,FAQ } 但是,这些枚举中的每一个都会有一个状态,如Failed,Loaded等.所以我希望能够使用REGISTER.LOADED,LOGIN.LOADED等来激活我的事件总线上的事件.但是每个状态枚举必须是唯一的. I.e Register.LOADED必须与FAQ.LOADED不同,依此类推. 编辑:此外,我必须能够将所有状态存储在同一个散列映射中,例如Register.LOADED和Login.LOADED必须可以存储在同一个散列映射中.并且父服务枚举,即LOGO,REGISTER等也必须存储在同一个散列映射中. 实现这一目标的最佳方法是什么? 解决方法
在OP的一些评论之后,我更新了我的代码.使用语法变得丑陋,在切换块中可能无法正常工作,但我相信这可以实现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(),FAQ(); public ServiceState state; Service() { this.state = ServiceState.LOADED; } public String toString() { return super.toString() + "." + state.toString(); } public enum ServiceState { LOADED,FAILED } } 输出:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |