【问题标题】:List all constants of specified class列出指定类的所有常量
【发布时间】:2014-11-02 23:08:50
【问题描述】:

我的问题是:如何创建指定类的所有常量的列表?

这可以通过简单的方式实现吗?或者我只需要为此编写自己的(有点简单的)解决方案?

让我展示一些代码:

public class StateOfSomeProcess {
    private final static String STATE_A = "State A";
    private final static String STATE_B = "State B";
    private final static String STATE_C = "State C";
    private final static String STATE_D = "State D";

    public StateOfSomeProcess() {...}

    public List<String> getListOfAllStates() {
        List<String> list = new ArrayList<String>();
        ...
        //I wish there was a method like this:
        //list = this.getAllConstantsFromClass();
        ...
        return list;
    }
}

我知道enums,但它似乎不符合我的需要。 如果我的问题不清楚或需要改进,请随时告诉我。

【问题讨论】:

  • 你熟悉“反射”这个概念吗? docs.oracle.com/javase/tutorial/reflect
  • 反射会做得很好。此外,您可以将所有这些常量添加到静态数组: private static String[] array = new String[]{STATE_A,STATE_B,STATE_C,STATE_D};
  • 很遗憾,不,我从未听说过反射,但我会检查一下。我是Java的初学者。感谢您的帮助:)
  • 恕我直言,将问题标记为重复并对其进行否决,有点苛刻。特别是考虑到OP的质量(高)和经验(低)。到Enums VS Classes VS Interfaces 的给定链接甚至没有提供问题的答案。
  • 谢谢,希勒。对其他人:明确引用我在那个“重复问题”中的问题的答案。我看过5次,然后问。我建议您再次阅读我要查找的内容。

标签: java list constants


【解决方案1】:

你可以写

private static List<String> getListOfAllStates() {
    List<String> list = new ArrayList<String>();

    for (Field field : StateOfSomeProcess.class.getDeclaredFields()) {
        int modifiers = field.getModifiers(); 
        if( Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) ) {
            list.add(field.getName());
        }
    } 
    return list;
}

【讨论】:

  • 哇!它就像一个魅力!我已经在一个小应用程序中对其进行了测试。但我也知道以前的答案以及应该避免反思的事实。我想我可以写出 Jeanne Boyarsky 指出的另外两个解决方案。谢谢希勒!
【解决方案2】:

我看到三个选项。

选项 1 - 自己创建一个 ArrayList 或数组

优点:快速且易于操作 缺点:容易过时

选项 2 - 使用反射

优点:它将永远是最新的 缺点:运行速度较慢(如果只执行一次,则不太可能成为问题),更难阅读代码

选项 3 - 以字符串形式读取文件

优点:它也将是最新的。 缺点:为您提供字符串,但不提供 Java 引用。我在编写单元测试时有时会使用这种方法(例如确认我没有忘记使用方法 #1 手动添加一些东西)

【讨论】:

  • 虽然您没有提供代码示例解决方案,但我必须承认我很欣赏您的回答。它为要检查的有趣事物提供了一些线索。也许我会暂时使用其中之一。为你点赞!
【解决方案3】:

这不完全是被问到的,但是因为我必须得到一个 的地图,所以我对 Jeanne 的答案做了一些修改,它可能会对某人有所帮助:

public class AnyNamesConstants {
    public static final String CONST_1 = "Constant 1";
    
    public static final String CONST_2 = "Constant 2";
    
    public static Map<String, Object> getMapConstValue() throws IllegalAccessException {
    
        Map<String, Object> map = new HashMap<>();
    
        for (Field field : AnyNamesConstants.class.getDeclaredFields()) {
            int modifiers = field.getModifiers();
            if( Modifier.isStatic(modifiers) && Modifier.isFinal(modifiers) ) {
                list.put(field.getName(), field.get(field.getType()));
            }
        }
        return map;
    }
}

你会得到:

{
    "CONST_1": "Constant 1",
    "CONST_2": "Constant 2"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2017-01-08
    • 1970-01-01
    • 2014-06-16
    相关资源
    最近更新 更多