Я изучаю 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 () на практике, потому что тогда я не могу восстановить объект источника данных.Я не прав?