我有一个有数百个静态字段的类,int字段代表颜色。
public class LColorPallette {
public static final int RED_050 = 0xfde0dc;
...
}
我希望将它们放在可以是arraylist,map或set的容器中。我知道可以声明一个静态命名空间,以便有类似的东西
public class ColorPalletteSingleton {
static {
container.add(...);
...
}
我需要一个例子来说明如何做或其他任何方式来解决我的问题?
由于
答案 0 :(得分:3)
static {}
不是“静态命名空间”,它是一个静态初始化块,用于初始化静态变量。
您可以将颜色存储为静态Collection
。
例如:
public static List<Integer> colors = new ArrayList<>;
static {
colors.add (RED_050);
...
}
答案 1 :(得分:2)
而不是静态字段更喜欢枚举。
What's the advantage of a Java enum versus a class with public static final fields?
enum LColorPallette {
RED_050(0xfde0dc);
private int hexValue;
private LColorPallette(int hexValue) {
this.hexValue = hexValue;
}
public String getHexValue()
{
return Integer.toHexString(hexValue);
}
}
Enum有值方法,它将返回array.No需要循环并添加到arrayList
List<LColorPallette> somethingList = Arrays.asList(LColorPallette .values());
UPDATE :由于VBR推荐使用Prefer EnumSet而不是List
EnumSet set = EnumSet.allOf(LColorPallette .class);
答案 2 :(得分:2)
您可以尝试使用reflection
获取所有字段。
List<Integer> result = new ArrayList<Integer>();
Field[] fields = LColorPallette.class.getDeclaredFields();
for(Field classField : fields){
result.add(classField.getInt(classField.getName()));
}
System.out.println(result);
答案 3 :(得分:1)
作为Map
:
public static final int RED_050 = 0xfde0dc;
public static final int RED_051 = 0xfde0df;
public void test() throws IllegalArgumentException, IllegalAccessException {
Map<String, Integer> colours = new HashMap<>();
Class<Test> myClass = (Class<Test>) this.getClass();
Field[] fields = myClass.getDeclaredFields();
for (Field field : fields) {
Type type = field.getGenericType();
// TODO: Make sure it is an int
int value = field.getInt(field);
System.out.println("Field " + field.getName() + " type:" + type + " value:" + Integer.toHexString(value));
colours.put(field.getName(), value);
}
}