1、定义枚举
public abstract class Enum {
private final String m_name;
private final String m_title;
private static final Map<Class<? extends Enum>, List<Enum>> ENUMS_MAP = new HashMap<>();
protected Enum(String name, String title) {
Objects.requireNonNull(name);
this.m_name = name;
this.m_title = title;
if (valueOf(name) != null) {
throw new IllegalArgumentException("enum of " + name + " has exists in " + getClass());
}
ENUMS_MAP.computeIfAbsent(getClass(), e -> new ArrayList<>()).add(this);
}
public String name() {
return this.m_name;
}
public String title() {
return this.m_title;
}
public String[] names() {
return names(getClass());
}
public static String[] names(Class<? extends Enum> type) {
if (!ENUMS_MAP.containsKey(type)) {
return new String[0];
}
return ENUMS_MAP.get(type).stream().map(Enum::name).toArray(String[]::new);
}
public Enum valueOf(String name) {
return valueOf(getClass(), name);
}
public static Enum valueOf(Class<? extends Enum> type, String name) {
if (!ENUMS_MAP.containsKey(type)) {
return null;
}
return ENUMS_MAP.get(type).stream().filter(e -> e.m_name.equalsIgnoreCase(name)).findFirst().orElse(null);
}
@Override
public int hashCode() {
return Objects.hash(m_name, m_title);
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (obj.getClass() != getClass()) {
return false;
}
return Objects.equals(m_name, ((Enum) obj).m_name);
}
@Override
public String toString() {
return "Enum{" +
"name='" + m_name + '\'' +
", title='" + m_title + '\'' +
'}';
}
}
2、实现枚举
public class Season extends Enum {
public static final Season SPRING = new Season("SPRING", "春季");
public static final Season SUMMER = new Season("SUMMER", "夏季");
public static final Season AUTUMN = new Season("AUTUMN", "秋季");
public static final Season WINTER = new Season("WINTER", "冬季");
protected Season(String name, String title) {
super(name, title);
}
public static void main(String[] args) {
Enum winter = Enum.valueOf(Season.class, "WINTER");
System.out.println(winter == WINTER);
String[] names = Enum.names(Season.class);
System.out.println(names.length);
}
}