ここに私の問題があります。これを「クリーナー」にする方法
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文字の多くのJSONですか?そうでない場合は、標準の[.properties](http://en.wikipedia.org/wiki/.properties)ファイルを使用してみましたか?上記のコードは上手く見えるが、標準的なメソッドが既に存在する場合はおそらく不要だと言っているだけです.-) – andyb
@Craigおそらくそれは私のものです。 :) @andyb:私はUTF8文字と複雑な構造の束を扱わなければならないので、残念ながら.propertiesファイルは使用できません。 –