在Java 8中一次修改几个字段变量

时间:2017-04-25 12:36:20

标签: java

我正在创建一个地图应用程序,其中包含用于绘制地图的所有颜色的类。颜色只是静态字段变量。我需要实现一个colourblind模式,我认为一个简洁(和时间有效)的解决方案是将所有颜色变量放在类中并修改它们。

有没有办法在Java 8中一次处理多个字段变量,或者我是否需要将它们添加到列表中并像这样运行它们?

2 个答案:

答案 0 :(得分:0)

静态变量应该用于描述类的属性(例如实例计数器)。尽管可能,使用它们来包含实例的属性是一个设计错误,当您的应用程序发展时会给您带来许多麻烦。

如果您只需要一个Map实例,请将其定义为Singleton。在任何情况下,我建议你不要在描述特定实例的事情上使用静态变量(比如特定地图的颜色)。

关于如何使用一个语句分配多个字段,请在此处查看BeanUtils #copyProperties:

https://commons.apache.org/proper/commons-beanutils/apidocs/org/apache/commons/beanutils/BeanUtils.html#copyProperties-java.lang.Object-java.lang.Object-

答案 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的接口。然后,您可以从此接口实现两个类。一类用于普通颜色,另一类用于颜色盲色。 加载应用程序设置时,您可以根据用户设置创建其中一个类的实例。