Java создать модель с базовой базовой моделью - PullRequest
1 голос
/ 07 октября 2019

Я хочу создать несколько классов, которые имеют почти одинаковые атрибуты для каждого. Пример: 1. Класс A, атрибуты: String a, String b, String c, AnObject d 2. Класс B, атрибуты: String a, String b, String c, OtherObject d

Разница между классом A иB только в атрибутах d.

Я создал класс

public class C <T> {
    private String a;
    private String b;
    private String c;
    private T d;
}

Затем для класса A

public class A extends C<A> {
    private SomeObject z;
}

И для класса B

public class B extends C<B> {
    private OtherObject z;
    private Integer y;
}

Однако, это становится проблемой, когда я делаю это в формате JSON, используя Джексона. A стань примерно таким:

{
    "a": "",
    "b": "",
    "c": "",
    "d": {
        "a": null,
        "b": null,
        "c": null,
        "z": ""
    }
}

Чего я хочу достичь, это:

{
    "a": "",
    "b": "",
    "c": "",
    "d": {
        "z": ""
    }
}

Как этого добиться?

Ответы [ 2 ]

0 голосов
/ 07 октября 2019

Я вижу здесь два возможных решения: использование только универсального класса без наследования или использование наследования без универсальных.

Классы A и B не должны расширять класс C. Эти избыточные свойства попадают в JSON-представление из родительского класса (а именно C).

    public class C <T> {
        private String a;
        private String b;
        private String c;
        private T d;
    }

    public class A {
        private SomeObject z;
    }

    public class B {
        private OtherObject z;
        private Integer y;
    }

    // example of usage
    C<A> a = new C<>();
    a.setD(new A());
    // and so on
    C<B> b = new C<>();
    b.setD(new B());
    // and so on

Другой способ - сделать A и B дочерними для C, что в данном случае нене должно быть общим.

    @JsonTypeInfo(
      use = JsonTypeInfo.Id.NAME, 
      include = JsonTypeInfo.As.PROPERTY, 
      property = "type")
    @JsonSubTypes({ 
      @Type(value = A.class, name = "a"), 
      @Type(value = B.class, name = "b") 
    })
    public class C {
        private String a;
        private String b;
        private String c;
    }

    public class A extends C {
        private SomeObject z;
    }

    public class B extends C {
        private OtherObject z;
        private Integer y;
    }

    // example of usage
    A a = new A();
    B b = new B();
0 голосов
/ 07 октября 2019

Скорее всего, это происходит потому, что вы используете Generics. Класс C содержит свой дочерний элемент (private T d), поэтому, когда вы создаете экземпляр A, вы наследуете поля a, b, c и другой экземпляр A, который также содержит поля a, b, c. Не уверен, что вы собираетесь здесь, но если вы хотите исправить это, удалите Generics (private T d) из c.

public class C {
    private String a;
    private String b;
    private String c;
}
public class A extends C {
    private SomeObject z;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...