2017-07-05 15 views
2

私はクラスthatsがプロパティ/構成クラスとして機能しています。これに加えて、プロパティを含むJSONファイルもあります。JSONファイルを使用して静的クラスを初期化する

私のメインクラスでは、プロパティオブジェクトをインスタンス化してからgsonのfromJsonメソッドを使用してJSONファイルをこのオブジェクトに読み込みます。私は他のクラスに渡して、プロパティにアクセスできるようにします。

プロパティにアクセスするためにインスタンス化する必要がないように、このプロパティクラスに静的変数とメソッドが含まれるようにデザインをリファクタリングしたいと考えています。

gsonを使用してこれが可能かどうか、またはこの設計が良い考えであるかどうか疑問に思っています。

ありがとうございました!

+1

どのように** not **?あなたがやっていることは、より良いデザインです。 –

+0

プロパティオブジェクトをクラスに渡しても問題ありませんか?申し訳ありませんが、私は自分のデザインパターンに自信がありません。 –

+0

'static'、' 'f''以外のデータに依存するものは全て、悪臭コードです。もちろん、オブジェクトが計算に依存しているデータは、積極的にそれらに提供され、取得するための静的な格納場所にはドロップされません。 –

答えて

0

あなたは正しい、プロパティクラスでstaticブロックを使用することができますか?あなたが今やっているようにフィールドを初期化してください。競合状態を避けるためにfinalにしてください。

-2

「しないでください」と言っている人は自由に無視してください。私たちよりもあなたのコードと要件をよく知っています。

あなたが探しているものは、Javaでは「リフレクション」と呼ばれています。 JSONのキーと値のペアをループして、リフレクションを使用してフィールドをルックアップし、フィールドを値に設定することができます。

This questionには、それを行う方法について細かい説明があります。

次に、static initializeブロックを使用して、インポート関数を開始します。

幸運を祈る!

EDIT:

いくつかのサンプルコードは、これが唯一のジェームズ・ゴスリングが今まで試みるべきいくつか読めない、複雑な、クレイジー恐ろしい、無良い、非常に、悪い考えではありません表示します。 :)

import java.lang.reflect.*; 
import net.sf.json.*; 

public class Test { 
    public static String hello = null; 

    static JSONObject readConfig() { 
     // fake read a config file 
     String settings = "{\"hello\": \"world\"}"; 
     JSONObject obj = (JSONObject)JSONSerializer.toJSON(settings); 
     return obj; 
    } 

    static { 
     // load config into static variables 
     JSONObject config = Test.readConfig(); 
     for (Object key : config.keySet()) { 
      String value = config.getString((String)key); 
      try { 
       Field field = Test.class.getDeclaredField((String)key); 
       field.set(null, value); 
       System.out.println("Set '"+ key +"' to '"+ value +"'."); 
      } catch (Exception e) { 
      System.err.println("Could not set unknown prop '"+ key +"' because "+ e +"."); 
      } 
     } 
    } 

    public static void main(String[] args) {} 
} 

そして、それが実行されている:

$ javac -cp .:/usr/share/java/* Test.java 
$ java -cp .:/usr/share/java/* Test 
Set 'hello' to 'world'. 
+1

これは、この質問者にとって間違った答えです。これは若いパダワンで、あなたはルークスカイウォーカーの答えを与えます。 – Totoro

+0

@トトロは正直に私は同意しません。私はプログラマーについて何も知らない、彼は彼のSOのスコアだけに基づいてジュニアだと仮定したくない。プラス彼のユースケースは合法的に聞こえる。私は自分の設定オプションのコンパイル時のチェックも望むでしょうが、それぞれのインポート関数を手動で微調整する必要はありません。良いエラーチェックは彼を安全に/元気に保つべきです。反射はそれほど複雑ではありません。 :) – keredson

+0

反射は難しくない、はい。それが他のチームによって解読不可能、解読不能または使用不可能にならないような方法でそれを使用することは、芸術です。そして、はい、私は彼のSO得点で予告しました。私は、このテクニックを敢えて、リフレクションのために必要なものを使って使用しません。 – Totoro

関連する問題