如何实现可复用的ISettings类型匹配校验?
解决方案
核心思路
通过泛型+目标类型Class对象的方式,在抽象类中统一实现校验逻辑,既避免依赖未初始化的settingsGlobal变量,又能让所有子类复用校验逻辑。
具体实现步骤
- 定义抽象基类
抽象类通过泛型约束对应的Settings类型,持有目标类型的Class对象,统一完成校验和赋值逻辑:
public abstract class BaseSettingsHolder<T extends ISettings> { protected final T settingsGlobal; private final Class<T> targetSettingsType; // 构造方法:接收传入的settings和目标类型Class protected BaseSettingsHolder(ISettings settingsLocal, Class<T> targetSettingsType) { this.targetSettingsType = targetSettingsType; if (!validateSettingsType(settingsLocal)) { throw new IllegalArgumentException("Settings type mismatch: expected " + targetSettingsType.getSimpleName()); } // 安全类型转换 this.settingsGlobal = targetSettingsType.cast(settingsLocal); } // 统一的校验逻辑 private boolean validateSettingsType(ISettings settingsLocal) { // 使用Class.isInstance()判断类型匹配,比getClass()更灵活(支持子类类型) return targetSettingsType.isInstance(settingsLocal); } }
- 子类继承抽象类
每个业务类只需继承抽象类,指定泛型参数并传入对应Settings的Class对象即可:
public class ExampleClass extends BaseSettingsHolder<ExampleSet1> { public ExampleClass(ISettings settingsLocal) { // 传入当前类需要的Settings类型Class super(settingsLocal, ExampleSet1.class); } } // 另一个使用ExampleSet2的子类示例 public class AnotherExampleClass extends BaseSettingsHolder<ExampleSet2> { public AnotherExampleClass(ISettings settingsLocal) { super(settingsLocal, ExampleSet2.class); } }
优势说明
- 校验逻辑完全复用,子类无需重复编写判断代码
- 彻底解决原方案中调用未初始化变量的问题,通过提前传入的
Class对象完成类型校验 Class.isInstance()比直接比较getClass()更灵活,若需要严格匹配类型,可改为settingsLocal.getClass().equals(targetSettingsType)
内容的提问来源于stack exchange,提问作者Persik Lopa
相关产品推荐
相关产品推荐

