Java - передать тип статическому методу суперкласса - PullRequest
6 голосов
/ 20 марта 2019

Допустим, у меня есть простой класс:

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

И я могу сериализовать любой объекткласса, расширяющего Serializer путем вызова метода toJson, например:

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?

1 Ответ

4 голосов
/ 20 марта 2019

Вы можете определить статический fromJson() метод в Serializer базовом классе:

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

Он не идеален с избыточной информацией типа и нене поддерживают дженерики хорошо.Следует отдавать предпочтение композиции перед наследованием и в этом случае исключать сериализацию из иерархии классов.Этот подход не имеет никакого преимущества перед простым:

TestClass obj = new Gson().fromJson(json, TestClass.class);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...