2011-06-20 54 views
3

這是我的問題。如何使這個「更清潔」

我有一堆由Gson序列化的配置類。它們都位於一個目錄中,並且序列化/反序列化過程非常相似,我覺得我應該將代碼移到父類中。

我終於想出了這個(我覺得這是可怕的做作):\

FooConfiguration.java:

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"); 
    } 
} 

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

我不得不問,你的配置複雜JSON有很多非拉丁-1字符?如果沒有,您是否嘗試過使用標準[.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

謝謝,我同意保存到一個單獨的課程。我會研究它。 –