重用方法并使代码更通用(Java,Jackson,通用类型)

问题描述 投票:0回答:1

我获得了使下一个代码更通用的任务,即从这些方法中创建一个方法。

public class JsonParser{

    private ObjectMapper objectMapper = new ObjectMapper();

    public static JsonNode fileToJson(File jsonFile){
            return objectMapper.readValue(jsonFile, JsonNode.class);
    }

    public static JsonNode stringToJson(String jsonString){
            return objectMapper.readValue(jsonString, JsonNode.class);
    }

    public static <T> T stringToGenericObject(String jsonString, Class<T> clazz){
            return objectMapper.readValue(jsonFile, clazz);
    }

}

我创建了下一个方法来替换上述3种方法:

public static <T , X> T dataToGenericObject(X jsonData, Class<T> clazz){
        if (jsonData.getClass() == String.class){
            return objectMapper.readValue((String) X, clazz);
        }
        else if (jsonData.getClass() == File.class){
            return objectMapper.readValue((File) X, clazz);
        }
        return null;
}

问题是必须将objectMapper.readValue的第一个参数强制转换为(字符串或文件)。

我知道有一种方法可以不使用强制转换,也不需要if语句。请提出建议。

还有其他方法吗?

我可以在此处执行其他重用或概括吗?

java json generics jackson code-reuse
1个回答
0
投票

您应该看一下Method Overloading中的Java。这种机制允许创建一组名称相同但参数数量不同或参数类型不同的方法。在您的情况下,它可能看起来像这样:

class JsonParser {

    private static ObjectMapper objectMapper = new ObjectMapper();

    public static JsonNode deserialise(File file) throws IOException {
        List<String> lines = Files.readAllLines(file.toPath());
        return deserialise(String.join("", lines));
    }

    public static JsonNode deserialise(String json) throws IOException {
        return deserialise(json, JsonNode.class);
    }

    public static <T> T deserialise(String json, Class<T> clazz) throws IOException {
        return objectMapper.readValue(json, clazz);
    }
}

这是干净且可维护的解决方案。如果您需要处理新的源类型,则只需实现新方法即可。

© www.soinside.com 2019 - 2024. All rights reserved.