本文目录导读:

我来详细讲解Java枚举判断的实操案例,从基础到进阶。
基础枚举判断
1 简单的状态判断
enum Status {
PENDING, PROCESSING, COMPLETED, FAILED
}
public class OrderService {
public void processOrder(Status status) {
// 使用switch判断
switch (status) {
case PENDING:
System.out.println("订单待处理");
break;
case PROCESSING:
System.out.println("订单处理中");
break;
case COMPLETED:
System.out.println("订单已完成");
break;
case FAILED:
System.out.println("订单失败");
break;
}
// 或者使用if-else判断
if (status == Status.PENDING) {
System.out.println("需要立即处理");
} else if (status == Status.COMPLETED) {
System.out.println("订单已完成");
}
}
}
枚举带属性判断
1 带字段的枚举
enum OrderStatus {
PENDING(0, "待支付", "黄色"),
PAID(1, "已支付", "蓝色"),
SHIPPED(2, "已发货", "绿色"),
DELIVERED(3, "已送达", "蓝色"),
CANCELLED(-1, "已取消", "红色");
private final int code;
private final String description;
private final String color;
OrderStatus(int code, String description, String color) {
this.code = code;
this.description = description;
this.color = color;
}
// Getter方法
public int getCode() { return code; }
public String getDescription() { return description; }
public String getColor() { return color; }
// 根据code获取枚举
public static OrderStatus fromCode(int code) {
for (OrderStatus status : values()) {
if (status.code == code) {
return status;
}
}
throw new IllegalArgumentException("未知状态码: " + code);
}
// 判断是否可以取消
public boolean canCancel() {
return this == PENDING || this == PAID;
}
// 判断是否可以退款
public boolean canRefund() {
return this == PAID || this == SHIPPED;
}
}
2 业务逻辑判断
public class OrderManager {
// 根据数据库状态码判断
public void updateOrderStatus(int statusCode) {
OrderStatus status = OrderStatus.fromCode(statusCode);
switch (status) {
case PENDING:
handlePendingOrder();
break;
case PAID:
handlePaidOrder();
break;
// ... 其他状态处理
}
}
// 复杂的业务逻辑判断
public boolean canProcessOrder(OrderStatus currentStatus, int userLevel) {
// 组合条件判断
if (currentStatus == OrderStatus.PENDING && userLevel >= 1) {
return true;
}
if (currentStatus == OrderStatus.PAID && userLevel >= 2) {
return true;
}
// 使用枚举方法判断
if (currentStatus.canCancel() && userLevel >= 3) {
return true;
}
return false;
}
}
高级判断技巧
1 使用Map存储状态机
enum State {
INIT, APPROVED, REJECTED, COMPLETED;
// 定义状态转换规则
private static final Map<State, List<State>> transitions = new HashMap<>();
static {
transitions.put(INIT, Arrays.asList(APPROVED, REJECTED));
transitions.put(APPROVED, Arrays.asList(COMPLETED, REJECTED));
transitions.put(REJECTED, Collections.emptyList());
transitions.put(COMPLETED, Collections.emptyList());
}
// 判断是否可以转换到目标状态
public boolean canTransitionTo(State target) {
List<State> allowedStates = transitions.get(this);
return allowedStates != null && allowedStates.contains(target);
}
// 执行状态转换
public State transition(State target) {
if (!canTransitionTo(target)) {
throw new IllegalStateException(
String.format("无法从 %s 转换到 %s", this, target));
}
return target;
}
}
2 枚举策略模式
enum DiscountType {
NEW_USER("新用户优惠") {
@Override
public double calculate(double amount) {
return amount * 0.8; // 8折
}
@Override
public boolean isApplicable(User user) {
return user.isNewUser();
}
},
VIP("VIP优惠") {
@Override
public double calculate(double amount) {
return amount * 0.7; // 7折
}
@Override
public boolean isApplicable(User user) {
return user.isVip();
}
},
SEASONAL("季节性优惠") {
@Override
public double calculate(double amount) {
return amount * 0.85; // 8.5折
}
@Override
public boolean isApplicable(User user) {
return checkSeason(user);
}
};
private String name;
DiscountType(String name) {
this.name = name;
}
public abstract double calculate(double amount);
public abstract boolean isApplicable(User user);
// 获取用户可用的最佳折扣
public static DiscountType getBestDiscount(User user, double amount) {
DiscountType best = null;
double maxDiscount = 0;
for (DiscountType type : values()) {
if (type.isApplicable(user)) {
double discount = amount - type.calculate(amount);
if (discount > maxDiscount) {
maxDiscount = discount;
best = type;
}
}
}
return best;
}
}
实际业务场景
1 权限判断
enum Permission {
READ(1, "读取"),
WRITE(2, "写入"),
DELETE(3, "删除"),
ADMIN(4, "管理");
private final int level;
private final String description;
Permission(int level, String description) {
this.level = level;
this.description = description;
}
// 判断用户是否有权限
public static boolean hasPermission(User user, Permission required) {
// 管理员拥有所有权限
if (user.getRole() == Role.ADMIN) {
return true;
}
// 根据用户角色判断权限
switch (user.getRole()) {
case EDITOR:
return required == READ || required == WRITE;
case VIEWER:
return required == READ;
default:
return false;
}
}
}
2 支付方式判断
enum PaymentMethod {
ALIPAY("支付宝", true) {
@Override
public void process(PaymentRequest request) {
// 支付宝支付处理逻辑
System.out.println("通过支付宝处理支付");
}
},
WECHAT("微信支付", true) {
@Override
public void process(PaymentRequest request) {
// 微信支付处理逻辑
System.out.println("通过微信处理支付");
}
},
BANK_CARD("银行卡", true) {
@Override
public void process(PaymentRequest request) {
// 银行卡支付处理逻辑
System.out.println("通过银行卡处理支付");
}
},
CREDIT("信用支付", false) {
@Override
public void process(PaymentRequest request) {
// 信用支付处理逻辑
if (!this.isAvailable()) {
throw new UnsupportedOperationException("信用支付暂不可用");
}
System.out.println("通过信用支付处理");
}
};
private final String displayName;
private final boolean available;
PaymentMethod(String displayName, boolean available) {
this.displayName = displayName;
this.available = available;
}
public abstract void process(PaymentRequest request);
public boolean isAvailable() {
return available;
}
// 根据用户选择进行支付
public static PaymentResult pay(String method, User user, double amount) {
PaymentMethod paymentMethod = valueOf(method.toUpperCase());
// 判断支付方式是否可用
if (!paymentMethod.isAvailable()) {
return PaymentResult.failed("该支付方式暂不可用");
}
// 判断用户是否有权限使用该支付方式
if (!user.canUsePayment(paymentMethod)) {
return PaymentResult.failed("您没有权限使用该支付方式");
}
// 执行支付
try {
PaymentRequest request = new PaymentRequest(user, amount);
paymentMethod.process(request);
return PaymentResult.success();
} catch (Exception e) {
return PaymentResult.failed("支付失败: " + e.getMessage());
}
}
}
最佳实践
1 判空处理
public class EnumUtils {
// 安全获取枚举
public static <T extends Enum<T>> T safeValueOf(Class<T> enumClass, String name) {
if (name == null || name.isEmpty()) {
return null;
}
try {
return Enum.valueOf(enumClass, name.toUpperCase());
} catch (IllegalArgumentException e) {
return null;
}
}
// 安全的枚举判断
public static boolean isEnumValue(String name, Class<? extends Enum> enumClass) {
return safeValueOf(enumClass, name) != null;
}
}
2 完整示例
// 使用时避免空指针
public class EnumDemo {
public static void main(String[] args) {
// 正确的判断方式
String statusStr = "COMPLETED";
OrderStatus status = EnumUtils.safeValueOf(OrderStatus.class, statusStr);
if (status != null) {
System.out.println("状态描述: " + status.getDescription());
// 使用枚举方法判断
if (status.canCancel()) {
System.out.println("可以取消订单");
}
}
// 多个状态的判断
List<OrderStatus> validStatuses = Arrays.asList(
OrderStatus.PAID,
OrderStatus.SHIPPED
);
if (validStatuses.contains(status)) {
System.out.println("订单处于有效状态");
}
// 使用Stream进行批量判断
boolean anyMatch = Arrays.stream(OrderStatus.values())
.anyMatch(s -> s.getCode() > 0);
}
}
通过以上案例,你可以看到Java枚举判断的多种实现方式,掌握这些技巧可以帮助你写出更清晰、更安全的代码,关键是要根据实际业务场景选择合适的判断方式。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播