Любой способ преобразовать константы Java в классе констант в итеративную форму в другом? - PullRequest
2 голосов
/ 18 мая 2011

У меня есть класс констант, полный набора финальных статических строк. Мне нужен способ получить доступ ко всем этим константам в этом классе в удобной форме типа массива, не создавая вручную массив с каждой константой.

Есть ли какой-нибудь метод в классе, который мог бы вернуть мне итеративную структуру данных, которую я мог бы перебрать в другом классе?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 18 мая 2011

Вы можете использовать отражение, чтобы получить объявленные поля:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

public class field1 {
    private double d;
    public static final int i = 37;
    String s = "testing";

    public static void main(String args[]) {
        field1 f = new field1();

        try {
            Class cls = Class.forName("field1");

            Field fieldlist[] = cls.getDeclaredFields();
            for (Field field : fieldlist) {
                System.out.println("name = " + field.getName());
                System.out.println("decl class = " + field.getDeclaringClass());
                System.out.println("type = " + field.getType());

                int mod = field.getModifiers();
                System.out.println("modifiers = " + Modifier.toString(mod));
                System.out.println("value = " + field.get(f));
                System.out.println("-----");
            }
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

Этот образец взят из здесь

3 голосов
/ 18 мая 2011

Рассмотрите возможность использования enum

enum Foo{
    //do stuff
}

Тогда вы можете итерировать через константы, используя Foo.values(), как таковые

for(Foo f: Foo.values()){
    //do stuff
}

Ссылка: Учебные руководства по Java

2 голосов
/ 18 мая 2011

Ну, есть Class.getFields(). Однако определение собственного массива будет проще и даст вам контроль над содержимым и порядком.

В зависимости от ваших потребностей, вы можете создать один массив за один раз.

public static final String FOO = "foo";
public static final String BAR = "bar";
public static final String BAZ = "baz";
public static final String[] ALL = { FOO, BAR, BAZ };

В качестве альтернативы, вы можете заменить все константы String перечислителями и предоставить метод toString () в перечислении. Как много работы это зависит от вашей существующей кодовой базы.

...