У меня есть 3 класса данных
@Data
class A
{
private int a;
}
@Data
class B extends A
{
private int b;
}
@Data
class C extends A
{
private int c;
}
Класс B и C имеют некоторые общие поля между ними, которые хранятся в родительском классе A. Ниже приведен класс тестера
class TesterClass
{
static String bOrC = "C"; // input from some decision
public static void main(String[] args) // assume this to be the client
{
A a;
if (bOrC.equals("B")) {
B b = new B();
b.setB(11);
a = b;
} else {
C c = new C();
c.setC(12);
a = c;
}
a.setA(10);
doSomething(bOrC, a);
}
// Below are the service methods
// only this method in the service exposed
public static void doSomething(String bOrC, A a) {
if (bOrC.equals("B")) {
doSomethingWithB(a);
} else if (bOrC.equals("C")) {
doSomethingWithC(a);
}
}
public static void doSomethingWithB(A a) {
B b = (B) a; // possible ClassCastException
System.out.println(b.getA());
System.out.println(b.getB());
}
public static void doSomethingWithC(A a) {
C c = (C) a; // possible ClassCastException
System.out.println(c.getA());
System.out.println(c.getC());
}
}
Теперь проблема, с которой я сталкиваюсь, небезопасна. Dynami c Приведение типов, которое может столкнуться с проблемами приведения классов. Одним из возможных решений было бы создание отдельных объектов данных и установка общих полей (которых слишком много для моего реального случая) для обоих объектов отдельно в обоих классах B и C, которые затем выглядели бы следующим образом:
public class TesterClass
{
static String bOrC = "C"; // input from some decision
public static void main(String[] args)
{
if (bOrC.equals("B")) {
B b = new B();
b.setA(10); // duplication
b.setB(11);
doSomethingWithB(b);
} else {
C c = new C();
c.setA(10); // duplication
c.setC(12);
doSomethingWithC(c);
}
}
public static void doSomethingWithB(B b) {
System.out.println(b.getA());
System.out.println(b.getB());
}
public static void doSomethingWithC(C c) {
System.out.println(c.getA());
System.out.println(c.getC());
}
}
Я ищу способ избежать приведения типа динамического c, но в то же время избегать дублирования общих переменных. Кто-нибудь может предложить решение?