我正在创建一个地图应用程序,其中包含用于绘制地图的所有颜色的类。颜色只是静态字段变量。我需要实现一个colourblind模式,我认为一个简洁(和时间有效)的解决方案是将所有颜色变量放在类中并修改它们。
有没有办法在Java 8中一次处理多个字段变量,或者我是否需要将它们添加到列表中并像这样运行它们?
答案 0 :(得分:0)
静态变量应该用于描述类的属性(例如实例计数器)。尽管可能,使用它们来包含实例的属性是一个设计错误,当您的应用程序发展时会给您带来许多麻烦。
如果您只需要一个Map实例,请将其定义为Singleton。在任何情况下,我建议你不要在描述特定实例的事情上使用静态变量(比如特定地图的颜色)。
关于如何使用一个语句分配多个字段,请在此处查看BeanUtils #copyProperties:
答案 1 :(得分:0)
您可以使用反射执行此操作,但请注意所有可能的例外情况:
import java.lang.reflect.*;
class Colors {
public static int COLOR1 = 123;
public static int COLOR2 = 321;
}
public class Test3 {
public static void modify(Class<?> clazz) throws IllegalAccessException {
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (Modifier.isStatic(f.getModifiers())) {
f.setInt(f, 666);
}
}
}
public static void main(String[] args) throws Exception {
System.out.println("Before: " + Colors.COLOR1);
System.out.println("Before: " + Colors.COLOR2);
modify(Colors.class);
System.out.println("After: " + Colors.COLOR1);
System.out.println("After: " + Colors.COLOR2);
}
}
但我不认为这是一个干净的解决方案。这隐藏了依赖关系,并不像OOP那样。您应该使用为每种颜色定义getter的接口。然后,您可以从此接口实现两个类。一类用于普通颜色,另一类用于颜色盲色。 加载应用程序设置时,您可以根据用户设置创建其中一个类的实例。