Java中的数据库和加密

时间:2019-05-10 12:33:51

标签: java sql dao

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

例如。如果应用程序包含具有使用过的单例设计模式的IdGenerator类构建,则可以在对象创建期间使用它来生成唯一的ID。因此,接口仅共享getId()方法。但是,如果我想从数据库中还原对象怎么办?我只需要setId()方法来还原对象。有什么解决方案(我的意思是某种解决问题的设计模式)? 我对Spring和JUnit有同样的问题。我不知道我是否不了解某些内容,否则它会强制将getter和setter用于我们要注入的所有内容。

我创建了示例项目:

在模型包中。people是接口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++;
    }

}

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

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

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


        Person personRestoredObject = PersonImpl(loadedName);

    }

}

,但无法还原旧ID。 ID由构造函数创建。那么,该问题有任何设计模式吗?

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

0 个答案:

没有答案