Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库信息->;对象:应该如何做?_Java_Oop_Design Patterns - Fatal编程技术网

Java 数据库信息->;对象:应该如何做?

Java 数据库信息->;对象:应该如何做?,java,oop,design-patterns,Java,Oop,Design Patterns,我的应用程序将根据请求从数据库中检索信息,并根据该信息生成一个对象。我目前正在考虑两种不同的技术(但我也对其他人持开放态度!)来完成这项任务: 方法一: class Book { private int id; private String author; private String title; public Book(int id) { ResultSet book = getBookFromDatabaseById(id);

我的应用程序将根据请求从数据库中检索信息,并根据该信息生成一个对象。我目前正在考虑两种不同的技术(但我也对其他人持开放态度!)来完成这项任务:

方法一:

class Book {

    private int id;
    private String author;
    private String title;

    public Book(int id) {

        ResultSet book = getBookFromDatabaseById(id);

        this.id = book.id;
        this.author = book.author;
        // ...

    }

}
方法二:

public class Book {

    private HashMap<String, Object> propertyContainer;

    public Book(int id) {

        this.propertyContainer = getBookFromDatabaseById(id);

    }

    public Object getProperty(String propertyKey) {

        return this.propertyContainer.get(propertyKey);

    }

}
公共课堂教材{
私有HashMap propertyContainer;
公共图书(国际id){
this.propertyContainer=getBookFromDatabaseById(id);
}
公共对象getProperty(字符串propertyKey){
返回此.propertyContainer.get(propertyKey);
}
}
对于方法一,我相信它更容易控制、限制和可能访问属性,但是,添加新属性,使用方法二会变得更平滑


做这件事的正确方法是什么?

我认为这个问题已经在很多方面得到了解决:ORM、DAO、行和表映射器,还有很多其他方法。没有必要再重做一次

您必须认真考虑的一个问题是包之间的耦合和循环依赖关系。通过告诉模型对象如何持久化自己,您可能认为您做了一些聪明的事情,但是这种设计选择的一个结果是模型对象和持久化层之间的耦合。如果执行此操作,则无法使用没有持久性的模型对象。它们真的变成了一个大而笨重的包裹。没有分层

另一种选择是让模型对象保持对它们是否被持久化的漠不关心。这是一种单向依赖:持久性了解模型对象,但不了解其他方面


谷歌搜索其他解决方案。没有必要再打败那匹死马。

第一条是经典的方法。第二种方法真的很棘手。

第一种方法将为相关访问器提供类型安全性,这样您就可以知道要返回的对象的类型,而不必强制转换为您期望的类型(在提供原语以外的任何内容时,这一点变得更加重要)

出于这个原因(再加上它将使生成的代码更简单、更易于阅读),我会选择第一个。在任何大型应用程序中,您也将能够快速、轻松、整洁地在代码中获取参数值,以便在对象本身内进行调试等


如果其他任何人也要处理这段代码(或者你打算在忘记它后再处理它),第一段代码也会有帮助,因为你知道参数等。第二段代码只会提供大量的javadoc。

请注意,这是一个没有错误处理等的简化示例。