2011-06-20 12 views
3

ここに私の問題があります。これを「クリーナー」にする方法

Gsonによってシリアル化されるConfigurationクラスがたくさんあります。それらはすべて1つのディレクトリにあり、シリアライゼーション/デシリアライゼーションのプロセスは似ていて、コードを親クラスに移動する必要があると感じました。

私は最終的には(私はそれが恐ろしく不自然と感じる)この思い付いた:

package com.bar.foo; 

import java.io.File; 
import java.io.IOException; 

public interface FooConfiguration { 
    /** 
    * Saves the configuration object to disk 
    * @param location the location to save the configuration 
    */ 
    public void save(File location) throws IOException; 
} 

FooConfigurationAbstract.java:

package com.bar.foo; 

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 

import com.google.gson.Gson; 

public abstract class FooConfigurationAbstract implements FooConfiguration { 
    File location; 
    Gson gson; 

    @Override 
    public void save(File location) throws IOException { 
     FileUtils.writeStringToFile(location, gson.toJson(this), "utf-8"); 
    } 
} 

FooConfiguration.java \ FooConfigurationImpl.java:

package com.bar.foo; 

- snip imports - 

public class FooConfigurationImpl extends FooConfigurationAbstract { 

    /** 
    * Whether or not the we should use the new Bar feature 
    */ 
    @Expose 
    public Boolean useBar = false; 

    - snip more configuration values - 
} 

FooConfigurationFactory.java:

package com.bar.foo; 

import java.io.File; 
import java.io.IOException; 

import org.apache.commons.io.FileUtils; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 

public class FooConfigurationFactory<T extends FooConfiguration> { 
    public static Gson gson = new GsonBuilder() 
      .setPrettyPrinting() 
      .excludeFieldsWithoutExposeAnnotation() 
      .create(); 
    public Class<T> clazz; 
    public File basePath; 

    public FooConfigurationFactory(File basePath, Class<T> clazz) { 
     this.basePath = basePath; 
     this.clazz = clazz; 
    } 

    public T load(String location) throws IOException { 
     return this.load(location, FooConfigurationFactory.gson); 
    } 

    public T load(String location, Gson gson) throws IOException { 
     return gson.fromJson(
       FileUtils.readFileToString(
        new File(this.basePath, location), "utf-8"), 
       this.clazz); 
    } 
} 

使用例:

this.config = new FooConfigurationFactory<FooConfigurationImpl>(this.configDir, FooConfigurationImpl.class).load("config.json"); 

これは私が私の人生で見てき最も醜いものであるように私は感じます。私のアプローチは単に間違っているのですか、それとももっと良い方法がありますか?

ありがとうございます。

+1

私は個人的にこれを非常にきれいで正確なコードと見ています。私はそれが良いようだと思う:/ –

+0

私は、あなたの構成複雑な非ラテン1文字の多くのJSONですか?そうでない場合は、標準の[.properties](http://en.wikipedia.org/wiki/.properties)ファイルを使用してみましたか?上記のコードは上手く見えるが、標準的なメソッドが既に存在する場合はおそらく不要だと言っているだけです.-) – andyb

+0

@Craigおそらくそれは私のものです。 :) @andyb:私はUTF8文字と複雑な構造の束を扱わなければならないので、残念ながら.propertiesファイルは使用できません。 –

答えて

1
  • 階層を簡素化するには、saveを別のクラスに移動します。 (私はディスクへのコンフィギュレーションの保存はコンフィギュレーション自体の責任ではないと思います)
  • 実際には一般的なコンフィギュレーションファクトリが必要ですか?ジェネリッククラスの代わりにジェネリックメソッドを使用することで、使用構文を簡素化できます。

public class FooConfigurationService { 
    ... 
    public void save(File location, FooConfiguration configuration) { ... }  
    public <T extends FooConfiguration> T load(File location, Class<? extends T> clazz) { ... } 
} 

... 

FooConfigurationFactory factory = ...; 
this.config = factory.load(location, FooConfigurationImpl);  
+0

ありがとう、私は別のクラスに保存を移動することに同意します。私はそれを調べます。 –

関連する問題