Инициализация переходного поля Java OOP при загрузке родителя POJO - PullRequest
0 голосов
/ 28 сентября 2018

Итак, у меня есть очень большой класс с сотнями временных объектов, которые необходимо переинициализировать каждый раз, когда родитель (в этом случае Person.class) загружается.(класс Peron.class загружен и сохранен)

Вот пример того, какова структура моего класса в данный момент:

public final class Person {

    private transient ObjectA a;
    private transient ObjectB b;
    private transient ObjectC c;
    private transient ObjectD d;
    //and hundreds more...

    public Person() {

        initTransientObjects();

    }

    private void initTransientObjects() {

        a = new ObjectA();
        b = new ObjectB();
        c = new ObjectC();
        d = new ObjectD();
        //and hundreds more...
    } 

    public void onReloadAfterFirstSave() {
        initTransientObjects();
    }

}

Это делает написание новых объектов очень утомительным, и я 'Мне интересно, есть ли способ сделать это более компактным, как это:

public final class Person {

    private transient ObjectA a = new ObjectA();
    private transient ObjectB b = new ObjectB();
    private transient ObjectC c = new ObjectC();
    private transient ObjectD d = new ObjectD();
    //and hundreds more...
    //this way I only have to type the new object once instead of twice

    public void onReloadAfterFirstSave() {
        //what here? because now transient fields are null
    }

}

Обратите внимание, что причина, по которой я не могу использовать вышеизложенное, заключается в том, что, очевидно, когда Person загружается снова, переходные поля не будутзагружен и, следовательно, автоматически устанавливается равным нулю.

Что мне здесь делать?

Редактировать:

Есть также непереходные объекты, которые я сохраняю и в классе Personкак эти переходные поля, поэтому использовать это не вариант:

Peron person = new Person(); //every load

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете попробовать это, но я не потворствую этому, в основном потому, что вам нужно быть очень осторожным с исключениями.Я предполагаю, что ваши конструкторы для ObjectA, ObjectB, ObjectC не пусты, и если они есть, это будет легче реализовать.

Я сделал пример класса только для вас

import java.lang.reflect.InvocationTargetException;
import java.util.Random;

/**
 *
 * @author emngaiden
 */
public class Test2 {

    ClassContainer[] containers;
    Object[] instantieted_objects;

    public Test2() {
        initObjects();
    }

    public static void main(String[] args) {
        Test2 test=new Test2();
        StringBuilder sb=(StringBuilder)test.getObject(2);
        sb.append((String)test.getObject(0));
        sb.append(((Random)test.getObject(1)).nextDouble());
        System.out.println(sb.toString());
    }

    public Object getObject(int i){
        return this.instantieted_objects[i];
    }

    private void initObjects() {
        //total number of objects ObjectA, ObjectB etc...
        int number_of_objects = 3;
        this.containers = new ClassContainer[number_of_objects];
        this.instantieted_objects = new Object[number_of_objects];
        //create the containers, you write this only one, and can
        //share it between objects of the same class
        this.containers[0] = new ClassContainer(String.class,
                new Class[]{String.class},
                new Object[]{"hello world"}
        );
        this.containers[1] = new ClassContainer(Random.class,
                new Class[]{long.class},
                new Object[]{192323l}
        );
        this.containers[2] = new ClassContainer(StringBuilder.class,
                null,
                null
        );
        //poblate the objects in the array
        for(int i=0; i<this.containers.length; i++){
            try{
                this.instantieted_objects[i]=instantiateObject(containers[i]);
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    //returns a new object instance based on the container
    private Object instantiateObject(ClassContainer container)
    throws NoSuchMethodException, InstantiationException, IllegalAccessException,
    IllegalArgumentException, InvocationTargetException {
        //no arguments for the constructor means that the constructor is empty
        if(container.args!=null){
            //get the constructor that matches the Class[] array on its arguments
            return 
                container.obj.getConstructor(container.args)
                .newInstance(container.values);
        }
        else{
            return container.obj.newInstance();
        }
    }

    //class to hold the necessary data to instantiate the object
    public class ClassContainer {

        //the target class, for ObjectA(int,int)this must be ObjectA.class 
        Class obj;
        //the argument classes, it would be {int.class,int.class}
        Class[] args;
        //the actual values for the constructor, it would be {1,2}
        Object[] values;

        public ClassContainer(Class obj, Class[] args, Object[] values) {
            this.obj = obj;
            this.args = args;
            this.values = values;
        }
    }
}

Это было забавно, но я не рекомендовал бы его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...