java 参数化抽象类中静态变量的用法

vpfxa7rd  于 2023-02-02  发布在  Java
关注(0)|答案(1)|浏览(98)

我正在为我们公司的客户生成报告。
我有一个抽象类,里面有很多静态final int成员:

public abstract class Customer_ItemIDs {
   public static final int item_001 = 34535;
   public static final int item_002 = 23455;
   public static final int item_003 = 74565;
   public static final int item_004 = 83480;
   ...
   public static final int item_122 = 65487;

}

在我生成报告的课堂中,我是这样使用它们的(稍微简化了一点):

int itemID_004;
itemID_004 = Customer_ItemIDs.item_004;

现在要求有了变化。
我需要支持另一个具有完全不同的ItemID的客户,我想把它放在另一个静态类中。项目的名称保持不变,只是值不同。

public abstract class CustomerB_ItemIDs {
   public static final int item_001 = 17538;
   public static final int item_002 = 56756;
   public static final int item_003 = 94445;
   public static final int item_004 = 93757;
   ...
   public static final int item_122 = 69483;

}

如何正确地参数化它,而不改变初始化itemID的每一行代码?我不想像这样初始化itemID:

int itemID_004;
if (customer == customerA) {
   itemID_004 = CustomerA_itemIDs.item_004;
}
else if (customer == customerB) {
   itemID_004 = CustomerB_itemIDs.item_004;
}

我想尽可能少地改变。

mspsb9vt

mspsb9vt1#

我觉得你应该试试Java Reflections:java.lang.reflect
为了不中断现有类的源代码,我将创建一个方法,它将返回HashMap,所有字段的名称为key,其int值为value,使用提供的类名作为参数:

public static Map<String, Integer> getStaticVariablesValue(Class givenClass) {
    
    Field[] fields = givenClass.getDeclaredFields();
    Map<String, Integer> resultValues = new HashMap<>();
    
    for (int i = 0; i < fields.length; i++)
        if (fields[i].getType() == int.class)
            try {
                resultValues.put(fields[i].getName(), fields[i].getInt(null));
            } catch (IllegalAccessException e) {
                e.printStackTrace(System.out);
            }
            
    return resultValues;
    
}

下面是一个简单的例子,它将打印所有字段的值提供类:

import java.util.*;
import java.lang.reflect.*;

class Main {
    public static void main(String args[]) {
        
        Map<String, Integer> customer_ItemIDsValues = new HashMap<>();
        Map<String, Integer> customerB_ItemIDsValues = new HashMap<>();

        customer_ItemIDsValues = getStaticVariablesValue(Customer_ItemIDs.class);
        customerB_ItemIDsValues = getStaticVariablesValue(CustomerB_ItemIDs.class);
        
        //Output values to console
        for (Map.Entry<String, Integer> entry : customer_ItemIDsValues.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
            
        for (Map.Entry<String, Integer> entry : customerB_ItemIDsValues.entrySet()) {
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }
    
    public static Map<String, Integer> getStaticVariablesValue(Class givenClass) {
        
        Field[] fields = givenClass.getDeclaredFields();
        Map<String, Integer> resultValues = new HashMap<>();
        
        for (int i = 0; i < fields.length; i++)
            if (fields[i].getType() == int.class)
                try {
                    resultValues.put(fields[i].getName(), fields[i].getInt(null));
                } catch (IllegalAccessException e) {
                    e.printStackTrace(System.out);
                }
                
        return resultValues;
    }

    abstract class CustomerB_ItemIDs {
       public static final int item_001 = 17538;
       public static final int item_002 = 56756;
       public static final int item_003 = 94445;
       public static final int item_004 = 93757;
       public static final int item_122 = 69483;
    }

    class Customer_ItemIDs {
       public static final int item_001 = 34535;
       public static final int item_002 = 23455;
       public static final int item_003 = 74565;
       public static final int item_004 = 83480;
       public static final int item_122 = 65487;
    }
}

相关问题