枚举
定义
我们学习过单例模式,即一个类只有一个实例。而枚举其实就是多例,一个类有多个实例,但实例的个数不是无穷的,是有限个数的。
@Getter
public class Season{
// 不能修改属性的值
private final String seasonName;
private final String seasonDesc;
// 私有化构造器,外部不能创建对象
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public static final Season spring = new Season("春天","小燕子回来了");
}
创建一个枚举类
public enum Season2{
// 创建枚举类对象,必须放在枚举类的行首
SPRING,
SUMMER;
//构造器只能使用private修饰,如果空参构造器可以省略不写默认也是private修饰
private Season2() {
}
}
@Getter
public enum Season3{
SPRING("春天"),
SUMMER("夏天");
final String seasonName;
Season3(String seasonName) {
this.seasonName = seasonName;
}
}
枚举类的主要方法
获取枚举中的所有对象
Season3[] values = Season3.values();
根据对象名称获取对象,如果没有要找的对象那么将会抛出异常
Season3 spring = Season3.valueOf("SPRING");
实现接口的枚举类
public class EnumTest {
public static void main(String[] args) {
Season4.SPRING.info();
}
}
interface Desc{
void info();
}
@Getter
enum Season4 implements Desc{
SPRING("春天"){
@Override
public void info() {
System.out.println("春天来了");
}
},
SUMMER("夏天"){
@Override
public void info() {
System.out.println("夏天来了");
}
};
final String seasonName;
Season4(String seasonName) {
this.seasonName = seasonName;
}
}
工具
/**
* <p>
*
* </p>
*
* @author Wangchenghong
* @Date 2019-11-07
*/
public class EnumUtil {
private static Map<Class, Object> map = new ConcurrentHashMap<>();
/**
* 根据条件获取枚举对象
*
* @param className 枚举类
* @param predicate 筛选条件
* @param <T>
* @return
*/
public static <T> Optional<T> getEnumObject(Class<T> className, Predicate<T> predicate) {
if (!className.isEnum()) {
return null;
}
Object obj = map.get(className);
T[] ts = null;
if (obj == null) {
ts = className.getEnumConstants();
map.put(className, ts);
} else {
ts = (T[]) obj;
}
return Arrays.stream(ts).filter(predicate).findAny();
}
}
使用
Optional<Season3> season3Optional = EnumUtil.getEnumObject(Season3.class,
e -> e.getSeasonName().equals("春天"));