在 Java 中,枚举(enum
)是一种特殊的数据类型,用于定义一组常量。它通常用于表示有限的一组固定值,例如星期几、颜色、状态等。枚举不仅仅是一些常量的集合,它们还可以包含字段、方法和构造函数,这使得枚举变得非常强大和灵活。
1. 用法
1. 1 枚举的基本用法
在 Java 中,枚举使用 enum
关键字定义。枚举中的每个值都是该枚举类型的一个实例。下面是一个简单的枚举示例:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
可以像这样使用枚举:
Day today = Day.MONDAY;
1.2. 带有属性和方法的枚举
枚举可以包含字段、构造函数和方法。例如,需要一个表示经济区的枚举,每个经济区包含一个城市ID的数组。
/**
* 经济区枚举
*/
public enum EconomicRegionEnum {
BTH("2", new Long[] {1L, 7362L, 13267L}),
JZS("3", new Long[] {167904L, 191019L, 161792L}),
SC("4", new Long[] {545532L, 533328L}),
HJL("5", new Long[] {145665L, 145665L, 115224L});
/**
* 类型编码
*/
private final String code;
/**
* 类型值
*/
private final Long[] value;
EconomicRegionEnum(String code, Long[] value) {
this.code = code;
this.value = value;
}
public String getCode() {
return code;
}
public Long[] getValue() {
return value;
}
}
在上述代码中:
EconomicRegionEnum
定义了四个枚举常量,表示四个不同的经济区,每个经济区包含多个城市或省份。- code字段保存该经济区的代码。
getCode()
方法 用于获取该经济区的代码。value
字段 保存该经济区中所有城市的列表。getValue()
方法 用于获取这些城市的列表。
2. 代码讲解
假设我们已经定义了 EconomicRegionEnum
,并且需要根据收发件省份来判断它们是否属于同一个经济区,然后基于经济区信息执行特定的查询操作:
// 获取经济区城市配置枚举
LinkedHashMap<String, EconomicRegionEnum> EconomicRegionMap = EnumUtil.getEnumMap(EconomicRegionEnum.class);
EconomicRegionEnum economicRegionEnum = null;
for (EconomicRegionEnum regionEnum : EconomicRegionMap.values()) {
// 检查当前经济区是否包含收件和发件省份
boolean result = ArrayUtil.containsAll(regionEnum.getValue(), receiverProvinceId, senderProvinceId);
if (result) {
economicRegionEnum = regionEnum;
break;
}
}
if (ObjectUtil.isNotEmpty(economicRegionEnum)) {
// 根据经济区代码查询相关的运费模板
LambdaQueryWrapper<CarriageEntity> queryWrapper = Wrappers.lambdaQuery(CarriageEntity.class)
.eq(CarriageEntity::getTemplateType, CarriageConstant.ECONOMIC_ZONE)
.eq(CarriageEntity::getTransportType, CarriageConstant.REGULAR_FAST)
.like(CarriageEntity::getAssociatedCity, economicRegionEnum.getCode());
// 执行查询...
}
这段代码的主要目的是校验某个运费模板是否适用于经济区之间的互寄场景。具体来说,它首先检查收件省份和发件省份是否都属于同一个经济区,然后根据这个经济区的代码,查询是否存在相应的运费模板。以下是详细的解释:
2.1 代码逐行解析
2.1.1 获取经济区城市配置枚举
// 获取经济区城市配置枚举
LinkedHashMap<String, EconomicRegionEnum> EconomicRegionMap = EnumUtil.getEnumMap(EconomicRegionEnum.class);
- **`EnumUtil.getEnumMap(EconomicRegionEnum.class)`**: 这行代码使用 `EnumUtil` 工具类获取了 `EconomicRegionEnum` 枚举的所有值,并将它们放入一个 `LinkedHashMap` 中。
- **`EconomicRegionEnum`** 是一个枚举类,代表了不同的经济区,每个经济区可能包含一个或多个城市或省份。
- **`EnumUtil.getEnumMap`** 方法返回一个 `LinkedHashMap`,其中键是枚举的名称,值是枚举的实例。
EconomicRegionEnum economicRegionEnum = null;
- 定义一个 `EconomicRegionEnum` 类型的变量 `economicRegionEnum`,用于存储匹配到的经济区。
2.1.2 检查收发件省份是否属于同一个经济区
for (EconomicRegionEnum regionEnum : EconomicRegionMap.values()) {
//该经济区是否全部包含收发件省id
boolean result = ArrayUtil.containsAll(regionEnum.getValue(), receiverProvinceId, senderProvinceId);
if (result) {
economicRegionEnum = regionEnum;
break;
}
}
- **`for (EconomicRegionEnum regionEnum : EconomicRegionMap.values())`**: 遍历所有的经济区枚举实例(从 `EconomicRegionMap` 中获取)。
- **`ArrayUtil.containsAll(regionEnum.getValue(), receiverProvinceId, senderProvinceId)`**: 检查当前经济区(`regionEnum`)是否包含传入的 `receiverProvinceId`(收件省份ID)和 `senderProvinceId`(发件省份ID)。
- **`regionEnum.getValue()`** 返回该经济区中包含的省份或城市的集合。
- **`ArrayUtil.containsAll`** 检查集合中是否包含指定的所有元素(即收件省份和发件省份ID)。
- 如果 `result` 为 `true`,则表示当前的收发件省份都属于 `regionEnum` 表示的经济区,接着将 `economicRegionEnum` 赋值为当前 `regionEnum`,并退出循环。
2.1.3 查询是否存在对应的运费模板
if (ObjectUtil.isNotEmpty(economicRegionEnum)) {
//3.2 根据类型编码查询
LambdaQueryWrapper<CarriageEntity> queryWrapper = Wrappers
.lambdaQuery(CarriageEntity.class)
.eq(CarriageEntity::getTemplateType, CarriageConstant.ECONOMIC_ZONE)
.eq(CarriageEntity::getTransportType, CarriageConstant.REGULAR_FAST)
.like(CarriageEntity::getAssociatedCity, economicRegionEnum.getCode());
- **`if (ObjectUtil.isNotEmpty(economicRegionEnum))`**: 检查是否找到了一个匹配的经济区(即 `economicRegionEnum` 不为空)。
- **`LambdaQueryWrapper<CarriageEntity> queryWrapper = Wrappers.lambdaQuery(CarriageEntity.class)`**: 创建一个用于构建查询条件的 `LambdaQueryWrapper` 对象,用于查询 `CarriageEntity` 实体(代表运费模板)的相关数据。
- **`queryWrapper.eq(CarriageEntity::getTemplateType, CarriageConstant.ECONOMIC_ZONE)`**: 添加一个查询条件,要求运费模板的 `templateType` 字段等于 `ECONOMIC_ZONE`(代表经济区模板的常量)。
- **`queryWrapper.eq(CarriageEntity::getTransportType, CarriageConstant.REGULAR_FAST)`**: 添加另一个查询条件,要求运费模板的 `transportType` 字段等于 `REGULAR_FAST`(代表常规快递的常量)。
- **`queryWrapper.like(CarriageEntity::getAssociatedCity, economicRegionEnum.getCode())`**: 添加一个模糊匹配的查询条件,要求 `associatedCity` 字段包含当前 `economicRegionEnum` 的代码。这意味着查找的模板应适用于当前识别出的经济区。
2.2 总结
上述代码实现了以下逻辑:
1. **识别经济区**: 通过检查收件省份和发件省份是否都属于同一个经济区,来确定它们是否在同一区域内互寄。
2. **查询运费模板**: 如果找到了匹配的经济区,就根据运费模板类型、运输类型,以及关联的城市信息,查询是否存在对应的运费模板。
通过这种方式,系统可以确保在处理运费计算时,考虑到经济区之间的互寄场景,选择正确的运费模板来处理运费的计算和应用。