2017-04-25 145 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的接口。然後你可以從這個接口實現兩個類。一類爲普通顏色,另一類爲色盲顏色。 加載應用程序設置時,根據用戶設置創建其中一個類的實例。