switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。 我们创建一个枚举:

@Getter

@AllArgsConstructor

public enum ProductEnum {

TYPE_1(1,"精品推荐"),

TYPE_2(2,"热门榜单"),

TYPE_3(3,"首发新品"),

TYPE_4(4,"猜你喜欢");

private Integer value;

private String desc;

}

用switch语句:

int a = 0;

// order

switch (a) {

//精品推荐

case ProductEnum.TYPE_1.getValue():

System.out.println("1");

break;

//首发新品

case ProductEnum.TYPE_2.getValue():

System.out.println("1");

break;

// 猜你喜欢

case ProductEnum.TYPE_3.getValue():

System.out.println("1");

break;

// 热门榜单

case ProductEnum.TYPE_4.getValue():

System.out.println("1");

break;

}

看上去没有问题,但是因为switch中需要的是一个常量,但是枚举中又是不可以加final关键字,所以会出现这种情况:(Constant expression required:需要常量表达式)

我们想要使用就需要封装一个方法在枚举类里面:

public static ProductEnum toType(int value) {

return Stream.of(ProductEnum.values())

.filter(p -> p.value == value)

.findAny()

.orElse(null);

}

封装后的枚举类:

@Getter

@AllArgsConstructor

public enum ProductEnum {

TYPE_1(1,"精品推荐"),

TYPE_2(2,"热门榜单"),

TYPE_3(3,"首发新品"),

TYPE_4(4,"猜你喜欢");

private Integer value;

private String desc;

public static ProductEnum toType(int value) {

return Stream.of(ProductEnum.values())

.filter(p -> p.value == value)

.findAny()

.orElse(null);

}

}

这个时候我们这么用:

int a = 0;

switch (ProductEnum.toType(a)) {

//精品推荐

case TYPE_1:

System.out.println("1");

break;

//首发新品

case TYPE_3:

System.out.println("2");;

break;

// 猜你喜欢

case TYPE_4:

System.out.println("3");

break;

// 热门榜单

case TYPE_2:

System.out.println("4");

break;

}

这样就没问题啦: