База данных и герметизация в Java - PullRequest
0 голосов
/ 10 мая 2019

Я изучаю Java и хочу сохранить состояние приложения.В объектно-ориентированном программировании мы должны скрывать реализацию и делиться функциональностью по интерфейсам.Работает нормально, пока мне не нужно восстанавливать данные из базы данных.

Например.Если приложение содержит сборку класса IdGenerator с использованным одноэлементным шаблоном проектирования, я могу использовать его для создания уникальных идентификаторов во время создания объекта.Поэтому интерфейс разделяет только метод getId ().Но что, если я хочу восстановить объекты из базы данных?Мне нужно метод setId () только для восстановления объектов.Есть ли какое-то решение для этого (я имею в виду некоторый шаблон проектирования, который решает проблему)?У меня такая же проблема с Spring и JUnit.Я не знаю, не понимаю ли я что-либо или это заставляет использовать методы получения и установки для всего, что мы хотим внедрить.

Я создал пример проекта:

В пакете model.peopleis interface Person:

public interface Person {
    long getId();
    Person setName(String name);
    String getName();
}

Таким образом, тот же пакет имеет класс реализации:

public class PersonImpl implements Person {
    private long id;
    private String name;
    public PersonImpl(String name){
        this.id = IdGenerator.getInstance().getID();
    }

    @Override
    public long getId() {
        return this.id;
    }

    @Override
    public Person setName(String name) {
        this.name = name;
        return this;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

Класс IdGenerator выглядит так:

public class IdGenerator {
    private static IdGenerator instance;
    private long lastId;

    private IdGenerator(){
        lastId = 0;
    }

    public static IdGenerator getInstance(){
        if (instance==null){
            instance = new IdGenerator();
        }
        return instance;
    }

    public long getID(){
        return lastId++;
    }

}

Таким образом, идентификатор уникалендля каждого объекта, и это не может быть изменено.Это причина того, что интерфейс Person не предоставляет метод с именем setId ();В результате я могу создать любой класс для восстановления данных из базы данных или файла:

public class DataLoader {
    public boolean loadData(String filePath){
        .
        .
        .
        .

        long loadedId = ....
        String loadedName = ....


        Person personRestoredObject = PersonImpl(loadedName);

    }

}

, но он не может восстановить старый идентификатор.Идентификатор создается конструктором.Так есть ли какой-то шаблон проектирования для проблемы?

Я вижу решение для этого, добавив класс Factory, у которого будет доступ к методу setId () на уровне пакета или специальный конструктор, доступный только на уровне пакета.Но я не вижу возможности не предоставлять метод setId () на практике, потому что тогда я не могу восстановить объект источника данных.Я не прав?

...