2017-04-25 4 views
0

マップを描画するために使用されるすべての色のクラスを持つマップアプリケーションを作成しています。色は静的なフィールド変数です。私はcolourblindモードを実装する必要があり、きちんとした(そして時間効率のよい)ソリューションは、クラス内のすべての色変数を取り、それらを変更することだと思っていました。Javaで一度にいくつかのフィールド変数を変更します。

多くのフィールド変数をJava 8で一度に処理する方法はありますか?それとも、それらをリストに追加してそのように実行する必要がありますか?

+3

私たちが参照したり提案したりできる基本的なシーン(コード)を教えてもらえればいいと思います。 – Smit

+2

[最小、完全、および検証可能な例](https://stackoverflow.com/help/mcve)が役立ちます。 –

答えて

0

静的変数は、クラスの属性(インスタンスカウンタなど)を記述するために使用します。可能であればインスタンスの属性を格納するためにそれらを使用することは、アプリケーションが進化するにつれて多くの問題を引き起こす設計エラーです。

マップのインスタンスが1つだけ必要な場合は、Singletonと定義します。いずれにしても、(特定のマップの色のような)特定のインスタンスを表すものに静的変数を使用しないことをお勧めします。

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

+0

あなたはOPが*静的変数を使用することをお読みになりましたか? –

+0

はい、それは率直にいいアイデアだとは思いません。 – Andres

+0

あなたの答えを強化して、それが悪い考えであり、あなたの提案が彼女の問題を解決する方法をOPに伝えることが良いかもしれません... –

0

あなたは、この使用して反射を行うが、すべての可能な例外を認識することができます:ここ々BeanUtilsの#のcopyPropertiesを見て、1文で多くのフィールドを割り当てる方法については

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のようなものではありません。各色のゲッターを定義するインタフェースを使用する必要があります。次に、このインタフェースから2つのクラスを実装できます。通常の色のクラスと、カラーブラインドの色のクラスです。 アプリケーション設定をロードするときに、ユーザー設定に応じてこれらのクラスのインスタンスを作成します。

関連する問題