Как клонировать "дерево классов" с другими именами классов в JAVA? - PullRequest
0 голосов
/ 06 мая 2018

Предположим, у меня есть 2 унаследованных класса с действительно большим количеством полей,

Я хочу создать еще одно "семейство наследования" с классами C, D, которое будет иметь те же значения - содержимое (в ВРЕМЯ РАБОТЫ), как в примере ниже ..

package server.api.analytics;

public class A {

    protected String param1;
    protected String param2;
    protected String param3;

    public String getParam1() {
        return param1;
    }

    public void setParam1(String param1) {
        this.param1 = param1;
    }

    public String getParam2() {
        return param2;
    }

    public void setParam2(String param2) {
        this.param2 = param2;
    }

    public String getParam3() {
        return param3;
    }

    public void setParam3(String param3) {
        this.param3 = param3;
    }

    public static void main(String[] args) {
        B b = new B();
        b.setParam1("out_param1");
        b.setParam2("out_param2");
        b.setParam3("out_param3");
        b.setParam4("out_param4");
        b.setParam5("out_param5");
        System.out.println(b.toString());

    // OUTPUT:
     B{param1='out_param1', param2='out_param2', param3='out_param3', 
         param4='out_param4', param5='out_param5'}
  //  EXPECTED : 
     D{param1='out_param1', param2='out_param2', param3='out_param3', 
         param4='out_param4', param5='out_param5'}
    }
}

class B extends A {
    protected String param4;
    protected String param5;

    public String getParam4() {
        return param4;
    }

    public void setParam4(String param4) {
        this.param4 = param4;
    }

    public String getParam5() {
        return param5;
    }

    public void setParam5(String param5) {
        this.param5 = param5;
    }

    @Override
    public String toString() {
        return "B{" +
                "param1='" + param1 + '\'' +
                ", param2='" + param2 + '\'' +
                ", param3='" + param3 + '\'' +
                ", param4='" + param4 + '\'' +
                ", param5='" + param5 + '\'' +
                '}';
    }
}

B{param1='out_param1', param2='out_param2', param3='out_param3', param4='out_param4', param5='out_param5'}

Я не хочу делать как "копирующий подрядчик" и просматривать все свойства, потому что их много, и если я сделаю "глубокое копирование" с клоном, имя класса будет таким же

Пример ожидается:

D{param1='out_param1', param2='out_param2', param3='out_param3', param4='out_param4', param5='out_param5'}

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете использовать BeanUtils.copyProperties((Object dest, Object orig) из общей библиотеки apache :

Скопировать значения свойств из исходного объекта в целевой компонент для все случаи, когда имена свойств совпадают.

Например:

  • B расширяет A
  • D входит в C

Ниже кода можно скопировать все поля из B в D:

import org.apache.commons.beanutils.BeanUtils;

public class Main {

    public static void main(String[] args) throws Exception {
        B source = new B();
        source.setParam("param");
        source.setParameter("parameter");
        D target = new D();
        try {
            BeanUtils.copyProperties(target, source);
        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println(source.getParam());  // param
        System.out.println(source.getParameter());  // parameter
        System.out.println(target.getParam()); // param
        System.out.println(target.getParameter()); // parameter
    }

    public static class A {
        String param;

        public String getParam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }
    }

    public static class B extends A {
        String parameter;

        public String getParameter() {
            return parameter;
        }

        public void setParameter(String parameter) {
            this.parameter = parameter;
        }
    }

    public static class C {
        String param;

        public String getParam() {
            return param;
        }

        public void setParam(String param) {
            this.param = param;
        }

    }

    public static class D extends C {
        String parameter;

        public String getParameter() {
            return parameter;
        }

        public void setParameter(String parameter) {
            this.parameter = parameter;
        }
    }
}
...