4

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

方法一:

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);

    }

}

使用方法一,我相信更容易控制、限制和可能访问属性,但是添加新属性,使用方法二会变得更顺畅。

这样做的正确方法是什么?

4

3 回答 3

3

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

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

另一种选择是让模型对象不知道它们是否被持久化。这是一种单向依赖:持久性知道模型对象,但反之则不然。

谷歌寻找其他解决方案。没必要再打败那匹死马了。

于 2012-09-03T20:26:25.783 回答
1

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

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

如果其他人也将使用此代码(或者您在忘记它之后计划使用它),第一个也将帮助您了解参数等。第二个只会为您提供广泛的 javadoc。

于 2012-09-03T20:28:03.943 回答
0

第一个是经典的方式。第二个真的很棘手。

于 2012-09-03T20:27:20.790 回答