【问题标题】:Java - pass type to superclass static methodJava - 将类型传递给超类静态方法
【发布时间】:2019-08-11 02:16:00
【问题描述】:

假设我有一个简单的类:

public class TestClass
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";
}

我的项目中有多个 pojo 类,我希望能够将每个对象序列化为 json。所以我创建了新的Serializer 类(用于序列化的gson):

public class Serializer
{
    public String toJson()
    {
        return new Gson().toJson(this);
    }
}

我的示例类扩展了Serializer

public class TestClass extends  Serializer
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";
}

我可以通过调用toJson 方法来序列化扩展Serializer 的任何类对象,如下所示:

TestClass test1 = new TestClass();
String json =  test1.toJson();

现在我想通过调用静态方法fromJson 来构造类对象。所以我的TestClass 看起来像这样:

public class TestClass extends  Serializer
{
    public String field1 = "Field1";
    public String field2 = "Field2";
    public String field3 = "Field3";

    public static TestClass fromJson(String json)
    {
        return new Gson().fromJson(json, new TypeToken<TestClass>() {}.getType());
    }
}

所以,我可以通过调用来创建新对象:

TestClass test2 = TestClass.fromJson(json);

当然,这不是好方法,因为我需要在我的所有类中包含 fromJson 实现。

问题:如何将fromJson移动到超类(Serializer),并为fromJson方法提供单一的、类型相关的实现?

【问题讨论】:

    标签: java generics inheritance types


    【解决方案1】:

    您可以在Serializer 基类中定义静态fromJson() 方法:

    public static class Serializer {
        public static <T> T fromJson(String json, Type type) {
            return new Gson().fromJson(json, type);
        }
    }
    

    并将其用作:

    TestClass obj = TestClass.fromJson(json, TestClass.class);
    

    冗余类型信息并不完美,也不能很好地支持泛型。应该支持composition over inheritance,在这种情况下,将序列化排除在类层次结构之外。这种方法没有简单的优势:

    TestClass obj = new Gson().fromJson(json, TestClass.class);
    

    【讨论】:

    • 唯一的优点是gson调用隐藏
    • @KarolDowbecki 我不会传递Class,而是传递Type
    • 如果有一些一致的 Gson 配置,您是否应该在这种情况下支持继承,例如设置 prettyprint?
    • @TobySmith 为什么不单独设置FormatConverter 类?除了立即显示或存储它之外,在 Java 程序中保留 JSON 的String 有什么用? @Eugene 谢谢,更新了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多