2017-04-25 150 views
0

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

有什么办法能够一次处理多字段变量在Java中8,或者我需要他们一样,添加到列表中,并运行通过他们?

+3

这将是很好,如果你可以给我们一些基础scenrio(代码),这是我们可以参考和提出建议。 – Smit

+2

A [Minimal,Complete,Verifiable example](https://stackoverflow.com/help/mcve)会很有帮助。你是否读过OP使用* static *变量的 –

回答

0

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

如果您需要的地图只有一个实例,它定义为Singleton。无论如何,我建议你不要将静态变量用于描述特定实例的东西(比如特定地图的颜色)。

关于如何分配多领域的一个说法,在这里看一看的BeanUtils#copyProperties:

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

+0

? –

+0

是的,不要认为这是一个好主意坦率地说。 – Andres

+0

这可能是一个好主意,增强你的答案告诉OP为什么这是一个坏主意,以及你的建议如何解决她的问题... –

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