java - 如何使这个 "cleaner"

标签 java optimization

这是我的问题。

我有一堆由 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");

我觉得这是我这辈子见过的最丑陋的东西。我的方法是完全错误的,还是有更好的方法?

最佳答案

  • 您可以通过将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);    

关于java - 如何使这个 "cleaner",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6408494/

相关文章:

java - InetAddresses 的 isInetAddress 和 isUriInetAddress 的区别

java - 为什么 toString 无法在不可变的 BigDecimal 上产生正确的值?

java - Sonarqube,找回原来的 Sonar 方式

c - 编译器是否允许消除无限循环?

string - 快速生成字符串组合的方法

assembly - 高效三值比较

optimization - 如何在 HTTP Content-Type 响应头中指定字符集?

java - 在 Android View 中显示动态文本

java - 在wildfly中分别部署JPA和REST包

python - Pandas - 使用来自索引的成对组合将数据帧转换为方矩阵