Java中的数据库和密封化

Java中的数据库和密封化,java,sql,dao,Java,Sql,Dao,我正在学习Java,我想保存应用程序状态。在面向对象编程中,我们应该隐藏实现并通过接口共享功能。在我不需要从数据库中恢复数据之前,它可以正常工作 比如说。如果应用程序包含IdGenerator类构建和使用的单例设计模式,我可以使用它在对象创建期间生成唯一的ID。所以接口只共享getId()方法。但是如果我想从数据库中恢复对象呢?我只需要使用setId()方法来恢复对象。有什么解决方法吗(我指的是解决问题的设计模式)? 我对Spring和JUnit也有同样的问题。我不知道我是否不理解一些东西,或者

我正在学习Java,我想保存应用程序状态。在面向对象编程中,我们应该隐藏实现并通过接口共享功能。在我不需要从数据库中恢复数据之前,它可以正常工作

比如说。如果应用程序包含IdGenerator类构建和使用的单例设计模式,我可以使用它在对象创建期间生成唯一的ID。所以接口只共享getId()方法。但是如果我想从数据库中恢复对象呢?我只需要使用setId()方法来恢复对象。有什么解决方法吗(我指的是解决问题的设计模式)? 我对Spring和JUnit也有同样的问题。我不知道我是否不理解一些东西,或者它迫使我们对所有我们想要注入的东西使用getter和setter

我创建了示例项目:

在包模型中。人员是接口人员:

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++;
    }

}
因此,每个对象的id都是唯一的,不能更改。这是Person接口不提供名为setId()的方法的原因;因此,我可以创建任何用于从数据库或文件还原数据的类:

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

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


        Person personRestoredObject = PersonImpl(loadedName);

    }

}
但它无法还原旧id。id是由构造函数创建的。那么这个问题有什么设计模式吗


我看到了一个解决方案,通过添加一个Factory类,该类可以访问包级别上的setId()方法,或者只在包级别上可用的特殊构造函数。但我不认为在实践中不提供setId()方法的可能性,因为这样我就无法恢复对象的数据源。我错了吗?

如果您能提供一些代码示例,这将有助于我们更好地理解问题。好的。我将添加它。您可能正在寻找一个(ORDBMS),它将存储为对象而不是“关系表”。如果您能提供一些代码示例,它将帮助我们更好地理解这个问题。好的。我将添加它。您可能正在寻找一个(ORDBMS),它存储为对象而不是“关系表”