Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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/2/cmake/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_Object Construction - Fatal编程技术网

我应该加载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)中执行实际的业务逻辑,这样对象的构造可以在与实际业务不同的时间进行