前沿
我也是来学习公司大哥的写法,写的不好大佬们多多指正。
一,设计工厂类
NwmsInventoryLogTypeEnum
package com.excenon.bean.enums.nwms;
import com.alibaba.fastjson.annotation.JSONType;
import lombok.Getter;
import java.util.Arrays;
@Getter
@JSONType(serializeEnumAsJavaBean = true)
public enum NwmsInventoryLogTypeEnum {
ENTER_STORAGE( 1, "入库"),
EXPORT_STORAGE( 2, "出库"),
TRANSFER( 3, "调拨"),
ISSUE( 4, "领用"),
INVALIDATE( 5, "作废");
private Integer code;
private String desc;
NwmsInventoryLogTypeEnum(Integer code, String desc){
this.code = code;
this.desc = desc;
}
public static String getDescByCode(int code) {
return Arrays.stream(NwmsInventoryLogTypeEnum.values())
.filter(e -> e.code == code)
.map(NwmsInventoryLogTypeEnum::getDesc)
.findFirst()
.orElse("");
}
public static NwmsInventoryLogTypeEnum getEnumByCode(int code) {
return Arrays.stream(NwmsInventoryLogTypeEnum.values())
.filter(e -> e.code == code)
.findFirst()
.orElse(null);
}
public static Boolean notEnterOrExport(int code) {
return code == TRANSFER.getCode() || code == ISSUE.getCode() || code == INVALIDATE.getCode();
}
}
InventoryAbstractInterface 接口
定义了一个日志检测的方法
package com.excenon.data.community.service.nwms.factory;
import com.excenon.bean.domain.nwms.inventory.NwmsInventoryLogEntity;
public interface InventoryAbstractInterface {
Boolean logCheck(NwmsInventoryLogEntity logEntity);
}
InitializingBean 接口
org.springframework.beans.factory.InitializingBean
是 Spring 框架中的一个接口,它定义了一个方法afterPropertiesSet
。当一个类实现了该接口并且被 Spring 容器创建时,容器会在初始化过程中自动调用该方法。
afterPropertiesSet
方法的主要作用是用于在对象的属性设置完成后执行一些初始化操作。通常情况下,我们可以在这个方法中进行一些依赖注入的检查、资源的初始化、连接的建立等等。使用
InitializingBean
接口的好处是,我们可以将初始化逻辑放在一个统一的地方,并与 Spring 容器的生命周期进行关联。这样可以确保在对象被完全创建和设置属性之后,再执行相应的初始化操作,避免在对象尚未准备好的情况下进行操作。在您提供的代码中,
afterPropertiesSet
方法的具体实现是将NwmsInventoryLogTypeEnum.ISSUE
类型的对象注册到InventoryFactory
中,可能是为了在系统初始化阶段对该类型对象进行处理或调用。
InventoryAbstractHandler 抽象类
通过使用关键字
abstract
可以定义抽象类。抽象类可以包含抽象方法(用abstract
关键字修饰的方法),这些方法在抽象类中没有具体的实现,而是由子类来实现。
package com.excenon.data.community.service.nwms.factory;
import org.springframework.beans.factory.InitializingBean;
public abstract class InventoryAbstractHandler implements InventoryAbstractInterface, InitializingBean {
}
下面是基础抽象类的子类们
其中一个子类 继承 InventoryAbstractHandler。需要实现上面两个接口的方法
InventoryFactory
public static InventoryAbstractHandler getHandler(NwmsInventoryLogTypeEnum typeEnum)
方法:
- 这是一个静态方法,可以通过类名直接调用,不需要实例化对象。
- 它接收一个
NwmsInventoryLogTypeEnum
类型的参数typeEnum
,用于获取相应类型的处理器。- 内部通过调用
handler.get(typeEnum)
方法从handler
Map 中获取对应的处理器,并返回该处理器。
public static void register(NwmsInventoryLogTypeEnum typeEnum, InventoryAbstractHandler value)
方法:
- 这也是一个静态方法。
- 它接收两个参数,一个是
NwmsInventoryLogTypeEnum
类型的typeEnum
,另一个是InventoryAbstractHandler
类型的value
。- 在方法内部,首先判断传入的
typeEnum
和value
是否为空,如果为空则直接返回。- 然后调用
handler.put(typeEnum, value)
方法,将传入的typeEnum
和value
存入handler
Map 中。
private final static Map<NwmsInventoryLogTypeEnum, InventoryAbstractHandler> handler = Maps.newHashMap()
成员变量:
- 这是一个静态的、不可变的 Map 对象
handler
,用于存储NwmsInventoryLogTypeEnum
与InventoryAbstractHandler
的映射关系。- 使用
Maps.newHashMap()
方法创建了一个空的 HashMap 实例作为handler
的初始值。
@Component
public class InventoryFactory {
private final static Map<NwmsInventoryLogTypeEnum, InventoryAbstractHandler> handler = Maps.newHashMap();
public static InventoryAbstractHandler getHandler(NwmsInventoryLogTypeEnum typeEnum) {
return handler.get(typeEnum);
}
public static void register(NwmsInventoryLogTypeEnum typeEnum, InventoryAbstractHandler value){
if (Objects.isNull(typeEnum) || Objects.isNull(value)) {
return;
}
handler.put(typeEnum, value);
}
}
实现
通过工厂类获取到特定类型的处理器,并调用该处理器的logCheck
方法对传入的实体entity
进行处理 InventoryFactory.getHandler(type).logCheck(entity);