【问题标题】:Get all static String values from a final class as a String Array or List从最终类中获取所有静态字符串值作为字符串数组或列表
【发布时间】:2016-07-27 02:22:07
【问题描述】:

我有以下课程:

 public final class FileNames
{

    private FileNames()
    {}

    public static final String A                     = "a.csv";
    public static final String B                     = "b.csv";
    public static final String C                     = "123.csv";
    ...
}

现在我想从上面获取所有字符串值,在不同的类中的某个地方。输出可以是字符串数组或 ArrayList 或任何其他集合。我正在使用 jdk 1.7。不知道如何进行此操作,因为可以增加字符串列表,即可以加“D”、“E”等。

【问题讨论】:

  • 枚举对你来说是不可能的吗? - 每个枚举都带有一个 values() 方法,该方法列出了所有定义的值。
  • 这似乎是一个设计问题。如果您知道这些字符串是常量,是否有一个更好的 可以放置它们的地方,比如文件?
  • @Alexander 枚举也可以..但是当我尝试在枚举值上使用 switch 大小写时,它会要求字符串常量,我不同意使用与枚举名称相同的字符串值..我的意思是 A 不需要有“A”作为值
  • @Makoto 同意..这是一个更好的解决方案,但不幸的是我需要它在 java 类或枚举中..不允许存储相同的任何属性文件..

标签: java collections java-7


【解决方案1】:

你添加这个函数:

public static ArrayList<String> getFilenames() {
   ArrayList<String> filenames = new ArrayList<String>;

   filenames.add(A);
   filenames.add(B);
   filenames.add(C);

   return filenames;
}

然后你可以在类似的地方使用这个函数:

ArrayList<String> filenames = new ArrayList<String>;
filenames = Filenames.getFilenames();
String filenameA = filenames.get(0); // to retrieve the first element (A)
String filenameB = filenames.get(1); // to retrieve the second element (B)
// and so on...

如果您想添加更多内容并以自动方式进行转换,您可以查看:Java method with unlimited arguments

希望能帮到你。

【讨论】:

    【解决方案2】:

    Reflection 是你的朋友 :)

    public class Sample {
    
        public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
            Class<FileNames> clazz = FileNames.class;
            Field[] arr = clazz.getFields(); // Get all public fields of your class
            for (Field f : arr) {
                if (f.getType().equals(String.class)) { // check if field is a String
                    String s = (String)f.get(null); // get value of each field
                    // add s to a List
                    System.out.println(s);
                }
    
            }
        }
    
    }
    
     final class FileNames {
    
        private FileNames() {
        }
    
        public static final String A = "a.csv";
        public static final String B = "b.csv";
        public static final String C = "123.csv";
    
    }
    

    O/P:

    a.csv
    b.csv
    123.csv
    

    【讨论】:

    • 这绝对有效,但是……嗯?也许OP可以澄清是否有更好的地方可以放置这些字符串。
    • @Makoto - 我认为你是对的。这可能是 XY 问题
    • 像魅力一样工作!谢谢.. 是的,我确实想要数组中的字符串而不是 Sysout..但是我可以很好地管理:P.. 再次感谢 @TheLostMind
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    相关资源
    最近更新 更多