fro*_*die 1 java object-construction
这是一个设计问题.我正在尝试在两个实现之间做出决定.
为了正确解释这个,我需要一个例子.因此,为了举例:
我有一个班级可以生成一份报告,比如某个特定日子的某些股票市场价值.我创建了一个StockMarketReportGenerator对象,将其传递给今天的日期,并根据当前的市场价值生成报告.
在StockMarketReportGenerator"有" StockMarketData的对象.该StockMarketData对象的目的是包含存储在数据库中的表(可能称为StockMarket :))中的所有股票市场值,以及根据表数据计算的一些其他值.它具有与数据库连接的私有方法,检索数据,进行必要的计算,并将最终值存储在对象的成员变量中.(然后它有getter方法来公开这些值,但没有setter方法.)StockMarketData该类基本上是股票市场数据值的"持有者".我有一个称为" calculateStockMarketData()"的中心函数,它调用所有这些私有帮助器方法并设置对象.(我知道所有这些处理都可以通过Hibernate这样的框架更容易处理;但是决定手动执行它,因为它是一个非常小的,有点临时的项目,不值得设置.)
我的问题是这个 - 从我的ReportGenerator班级,我只需要StockMarketData对象来访问它的属性/成员变量 - 后处理和后期计算.这意味着,我真的希望得到预先填充数据的对象.所以我将calculateStockMarketData方法保密,并从StockMarketData
构造函数中自动调用它.但是我对在构造函数中进行所有处理然后没有任何公共方法感到有些不安.这是一个设计缺陷吗?或者这是最合乎逻辑的方式吗?基本上,以下哪两个实现更好?
1)(我当前的实现)将中心calculateStockMarketData()方法设为私有并从StockMarketData方法构造函数(通过今天的日期)调用它,这样无论什么时候有一个StockMarketData对象,它都已填充.因此,ReportGenerator在开始使用对象属性之前,我需要的所有内容都是行:
StockMarketData myData = new StockMarketData(someDate);
Run Code Online (Sandbox Code Playgroud)
2)使中心calculateStockMarketData()方法公开,以便为了设置StockMarketData对象,您需要显式调用该方法.所以从ReportGenerator课上我会编码:
StockMarketData myData = new StockMarketData(someDate);
myData.calculateStockMarketData();
Run Code Online (Sandbox Code Playgroud)
第一个对我来说是更好的设计,特别是因为在初始化之前不可能使用对象属性.但是我也不确定从构造函数执行大量代码的标准......我应该选择哪个?
Martin Fowler撰写了一篇关于依赖注入(Constructor vs. Setter injection)的优秀论文.他的建议是"尽可能地在施工时创造有效物品".
IMO,如果可能的话,最好构造有效的对象,因为它可以更容易地读取/观察代码的行为,因为您可以假设对象构造正确,并且您没有正确填充的对象相关的错误更少.setter与构造函数注入的问题不同于您所询问的问题,这是执行业务逻辑的位置问题.我认为最好使用构造函数来创建有效对象,然后在另一个公共方法(#2)中执行实际业务逻辑,这样对象的构造可以在与实际业务逻辑不同的时间发生.