我应该加载Java对象吗';是在构造上创建数据,还是通过方法调用显式创建数据?
这是一个设计问题。我试图在两种实现之间做出选择 为了正确地解释这一点,我需要一个例子。因此,为了举例说明: 我有一个类,可以生成一个关于,比如说,某一天特定股票市场价值的报告。我创建了一个我应该加载Java对象吗';是在构造上创建数据,还是通过方法调用显式创建数据?,java,object-construction,Java,Object Construction,这是一个设计问题。我试图在两种实现之间做出选择 为了正确地解释这一点,我需要一个例子。因此,为了举例说明: 我有一个类,可以生成一个关于,比如说,某一天特定股票市场价值的报告。我创建了一个StockMarketReportGenerator对象,将今天的日期传递给它,然后它根据今天的市场价值生成一个报告 StockMarketReportGenerator“有一个”StockMarketData对象。StockMarketData对象的目的是包含数据库中存储在表(可能称为StockMarket:
StockMarketReportGenerator
对象,将今天的日期传递给它,然后它根据今天的市场价值生成一个报告
StockMarketReportGenerator
“有一个”StockMarketData
对象。StockMarketData
对象的目的是包含数据库中存储在表(可能称为StockMarket:)中的所有股票市场值,以及从表数据计算出的一些其他值。它具有与数据库连接、检索数据、执行必要的计算以及将最终值存储在对象的成员变量中的私有方法。(然后它有getter方法来公开这些值,但没有setter方法。)StockMarketData
类基本上是股票市场数据值的“持有者”。我有一个名为“calculateStockMarketData()
”的中心函数,它调用所有这些私有助手方法并设置对象。(我知道,使用Hibernate这样的框架可以更轻松地处理所有这些处理;但由于这是一个非常小的、有点临时的项目,不值得设置,所以决定手动完成。)
我的问题是-从我的ReportGenerator
类中,我只需要StockMarketData
对象就可以访问它的属性/
成员变量-后处理和后计算。这意味着,我真的想让物体预填充
有数据。因此我将calculateStockMarketData
方法保持私有,并从StockMarketData
构造器。但是,对于在构造函数中完成所有处理,然后又没有任何公共方法,我感到有些不安。这是一个设计缺陷吗?或者这真的是最合乎逻辑的方式吗?基本上,以下两种实现中哪一种更好
1) (我当前的实现)将中央calculateStockMarketData()
方法设为私有,并从StockMarketData
方法构造函数(传递今天的日期)调用它,这样每当您有StockMarketData
对象时,它就已经被填充了。因此,在开始使用对象属性之前,我需要从ReportGenerator
类中获得以下内容:
StockMarketData myData = new StockMarketData(someDate);
2) 将中央calculateStockMarketData()
方法公开,以便为了设置StockMarketData
对象,您需要显式调用该方法。因此,从ReportGenerator
class I中,可以编写以下代码:
StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();
第一个让我印象深刻的是更好的设计,特别是因为在初始化对象属性之前不可能使用它们。但是我也不确定关于从构造函数执行大量代码的标准。。。我应该选择哪一个?一个好的做法是不要在构造函数中执行太多代码。一个好的做法是不要在构造函数中执行太多代码。我会选择第二个,特别是如果有可能向类中添加不依赖于该数据的方法
另一方面,如果你认为这个类在没有填充数据的情况下处于一个无效状态,你应该在构造上做它。
< P>我将使用第2个,特别是如果有可能向不依赖于那里的数据的类添加方法。p>另一方面,如果您认为该类处于无效状态而不填充数据,则应在构造上执行。
< P>我总是加载显式、后构造。从构造函数调用数据库可能会导致调试困难、代码更脆弱、不灵活,并且在对象的使用发生变化时会导致性能问题 我总是在构建后显式加载
从构造函数调用数据库可能会导致调试困难、代码更脆弱、不灵活,并且在对象的使用发生变化时会导致性能问题 马丁·福勒写了一篇关于这个问题的好文章。他的建议是“尽可能多地在构建时创建有效对象”
在我看来,如果可能的话,最好构造有效的对象,因为这样可以更容易地阅读/观察代码的行为,因为您可以假设对象构造正确,并且与未正确填充的对象相关的bug更少。setter和constructor注入的问题与您所问的不同,这是一个在哪里执行业务逻辑的问题。我认为最好使用构造函数来创建一个有效的对象,然后在另一个公共方法(您的#2)中执行实际的业务逻辑,这样对象的构造可以在与实际业务逻辑不同的时间进行。Martin Fowler写了一篇很好的文章。他的建议是“尽可能多地在构建时创建有效对象” 在我看来,如果可能的话,最好构造有效的对象,因为这样可以更容易地阅读/观察代码的行为,因为您可以假设对象构造正确,并且与未正确填充的对象相关的bug更少。setter和constructor注入的问题与您所问的不同,这是一个在哪里执行业务逻辑的问题。我认为最好使用构造函数来创建一个有效的对象,然后在另一个公共方法(您的#2)中执行实际的业务逻辑,这样对象的构造可以在与实际业务不同的时间进行