如何参数化抽象类静态变量以适配多客户ItemID需求
多客户ItemID常量的参数化实现方案
方案一:接口定义+依赖注入(推荐,符合开闭原则)
这种方式彻底消除对具体静态类的依赖,通过接口统一规范,后续新增客户只需添加新实现类,无需修改报表生成逻辑。
定义统一的ItemID接口
把所有需要用到的ItemID定义为接口方法,替代原来的静态常量引用:public interface ItemIDConstants { int getItem_004(); int getItem_005(); // 补充所有业务需要的ItemID对应的方法 }让现有客户常量类实现接口
无需修改原有静态常量,只需实现接口的getter方法返回对应常量:public abstract class Customer_ItemIDs implements ItemIDConstants { public static final int item_004 = 1004; public static final int item_005 = 1005; // 原有其他静态常量 @Override public int getItem_004() { return item_004; } @Override public int getItem_005() { return item_005; } // 实现剩余接口方法 }public abstract class CustomerB_ItemIDs implements ItemIDConstants { public static final int item_004 = 2004; public static final int item_005 = 2005; // 原有其他静态常量 @Override public int getItem_004() { return item_004; } @Override public int getItem_005() { return item_005; } // 实现剩余接口方法 }修改报表生成类,依赖接口而非具体实现
通过构造函数(或其他注入方式)传入对应客户的接口实现,替换原来的静态常量引用:public class ReportGenerator { private final ItemIDConstants itemIDs; // 构造注入,明确依赖 public ReportGenerator(ItemIDConstants itemIDs) { this.itemIDs = itemIDs; } public void generateReport() { // 原来的静态引用改为接口方法调用 int itemID_004 = itemIDs.getItem_004(); // 其他报表逻辑保持不变,仅替换常量引用方式 } }根据客户类型创建报表实例
因为原有常量类是抽象类,需创建匿名子类实例(或改为普通类,若没有抽象方法):// 生成客户A的报表 ReportGenerator customerAReport = new ReportGenerator(new Customer_ItemIDs() {}); // 生成客户B的报表 ReportGenerator customerBReport = new ReportGenerator(new CustomerB_ItemIDs() {});
方案二:常量提供类(最小代码修改)
如果不想改动报表类的结构,可创建一个统一的常量提供类,把分支判断集中在一处:
定义客户类型枚举
public enum CustomerType { CUSTOMER_A, CUSTOMER_B }创建ItemID提供类
所有常量引用都通过这个类的静态方法获取,分支仅在这里出现:public class ItemIDProvider { public static int getItem_004(CustomerType type) { return switch(type) { case CUSTOMER_A -> Customer_ItemIDs.item_004; case CUSTOMER_B -> CustomerB_ItemIDs.item_004; default -> throw new IllegalArgumentException("未知客户类型"); }; } // 为每个ItemID添加对应的静态方法 public static int getItem_005(CustomerType type) { return switch(type) { case CUSTOMER_A -> Customer_ItemIDs.item_005; case CUSTOMER_B -> CustomerB_ItemIDs.item_005; default -> throw new IllegalArgumentException("未知客户类型"); }; } }修改报表中的常量引用
把原来的Customer_ItemIDs.item_004替换为ItemIDProvider.getItem_004(customerType),无需在报表逻辑中写分支。
内容的提问来源于stack exchange,提问作者Josef
相关产品推荐
相关产品推荐

