我喜欢制作一个接受任何内容的泛型枚举。
对于这个例子,我使用TaskStatus,但在未来,我喜欢使用GenericEnum作为例子;StudentStatus,此学生状态本身可以带有id和描述,它将自动转换。此外,对每个对象进行迭代,最后自动返回。我能成功吗?
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum TaskStatusEnum{
READY(1, "Ready"),
ON_GOING (2,"On going");
private final long id;
private final String description;
public static TaskStatusEnum get (long id)
{
for (TaskStatusEnum status : TaskStatusEnum.values()) {
if (status.id == id) {
return id;
}
}
return null;
}
我不确定你到底想要什么。您可以使用enum上的接口,然后您可以使用接口作为状态,而不关心状态类到底是什么
public interface Status<E extends Enum<E> & Status<E>> {
public long getId();
public String getDescription();
}
学生身份:
public enum StudentStatus implements Status<StudentStatus>{
NEW(0, "new");
;
private long id;
private String description;
private StudentStatus(long id, String description) {
this.id=id;
this.description = description;
}
@Override
public long getId() {
return id;
}
@Override
public String getDescription() {
return description;
}
}
任务状态:
public enum TaskStatus implements Status<TaskStatus>{
OPEN(0, "open");
;
private long id;
private String description;
private TaskStatus(long id, String description) {
this.id=id;
this.description = description;
}
@Override
public long getId() {
return id;
}
@Override
public String getDescription() {
return description;
}
}
利用id 查找状态的通用方法
public abstract class StatusUtil {
public static <E extends Enum<E> & Status<E>> E get(Class<E> statusClass, long id) {
return Arrays.asList((E[]) statusClass.getEnumConstants())
.stream()
.filter(item -> item.getId() == id)
.findAny()
.orElse(null);
}
}
示例如何使用:
public class Test {
public static void main(String... args) {
StudentStatus studentStatus = StatusUtil.get(StudentStatus.class, 0);
TaskStatus taskStatus = StatusUtil.get(TaskStatus.class, 0);
List<Status> statusList = Arrays.asList(studentStatus, taskStatus);
statusList.forEach(status -> System.out.println(status.getClass().getName()+"t"+status.getId()+"t"+status.getDescription()));
}
}
如果您使用的JAVA低于8:
public interface Status<E extends Enum<E>> {
public long getId();
public String getDescription();
}
状态Util:
public abstract class StatusUtil {
public static <E extends Enum<E>> E get(Class<E> statusClass, long id) {
for(E item: (E[]) statusClass.getEnumConstants()) {
if(item.getId() == id) {
return item;
}
}
return null;
}
}测试:
public static void main(String... args) {
StudentStatus studentStatus = StatusUtil.get(StudentStatus.class, 0);
TaskStatus taskStatus = StatusUtil.get(TaskStatus.class, 0);
List<Status> statusList = Arrays.asList(studentStatus, taskStatus);
for(Status status: statusList) {
System.out.println(status.getClass().getName()+"t"+status.getId()+"t"+status.getDescription());
}
}
当枚举具有相同的方法并且您需要通用接口时,您可以使用这种方法
您的枚举实际上是final
(不允许子类(
显然,您正在询问TaskStatus
枚举是否可以被子类化。例如,制作继承自TaskStatus
的StudentStatus
。
➥不,Java中的枚举不能被子类化。
您的枚举定义实际上是Enum
的一个子类。这种情况发生在后台,由编译器神奇地处理继承到此为止您的枚举定义实际上是final
,不允许进一步的子类。
枚举定义可以实现接口。来自多个枚举定义的实例可以被视为同一接口的所有对象。参见胜利者的回答1125。
Java中的枚举是一种方便的方式,可以自动实例化一个或多个名称对象,以表示编译时已知的有限值集。当Java类加载器加载它们的定义类时,这些实例都会突然出现。那些物体留在记忆中。
不能在运行时动态添加更多实例。枚举对象的整个域是在编译时定义的。(例外:一些疯狂扭曲的反射/内省代码可能能够创建更多的实例,但我不会去那里。(
如果希望继承或动态创建实例,请不要使用枚举使用收集到集合或列表中的常规类和子类集合或列表可以用泛型标记(< … >
(,以允许其包含元素的超类。例如,Set< Animal >
可以包含子类Dog
、Cat
和Bird
的对象。
顺便说一句,您现在可以在3个地方定义枚举:它自己的类,嵌套在另一个类中,现在在Java 16中(在Java 15中预览(,本地在方法中。
提示:无需放置"枚举";在枚举的名称中。努力为您的枚举类和自然读取的枚举对象创建名称。它们恰好是一个枚举,这一事实应该淡出背景。例如:参见Month
(Month.JANUARY
(和DayOfWeek
(DayOfWeek.MONDAY
(。
如何处理StatusUtil.class 上的空点
状态Util:
公共抽象类StatusUtil{
public static <E extends Enum<E>> E get(Class<E> statusClass, long id) {
for(E item: (E[]) statusClass.getEnumConstants()) {
if(item.getId() == id) {
return item;
}
}
return null;
}