【发布时间】:2018-07-31 13:02:18
【问题描述】:
我有以下课程:
package com.tesco.demandforecasting.group8.choprachap7;
import java.util.ArrayList;
import com.tesco.demandforecasting.group8.utils.MathOperUtils;
import com.tesco.demandforecasting.group8.utils.RegressionUtils;
import lombok.Getter;
/**
* This class if used to find seasonality factor of each period, as explain in
* the chapter See https://kelley.iu.edu/mabert/e730/Chopra-Chap-7.pdf for the
* explanation
*/
@Getter
public class ChopraChap7SeasonalFactorsCalculator {
private double[] regressionParams;
private int sales_size;
private int periodicity;
private ArrayList<Integer> sales;
private ArrayList<Double> deseasonalisedData;
private ArrayList<Double> deseasonalisedDemandUsingRegression;
private ArrayList<Double> seasonalityFactors;
public ChopraChap7SeasonalFactorsCalculator() {
this.sales = new ArrayList<>();
this.deseasonalisedData = new ArrayList<>();
this.deseasonalisedDemandUsingRegression = new ArrayList<>();
this.seasonalityFactors = new ArrayList<>();
this.sales.add(8000);
this.sales.add(13000);
this.sales.add(23000);
this.sales.add(34000);
this.sales.add(10000);
this.sales.add(18000);
this.sales.add(23000);
this.sales.add(38000);
this.sales.add(12000);
this.sales.add(13000);
this.sales.add(32000);
this.sales.add(41000);
this.sales_size = sales.size();
this.periodicity = 4;
calculateSeasonalityFactors();
}
private void calculateSeasonalityFactors() {
.......
.......
this.seasonalityFactors = seasonalityFactors;
this.deseasonalisedDemandUsingRegression = deseasonalisedDemandUsingRegression;
this.deseasonalisedData = deseasonalisedData;
}
}
我想使用它们各自的 getter 将类字段公开给外部类。但是,问题是这些字段只有在调用 ChopraChap7SeasonalFactorsCalculator() 方法后才能获得任何值。所以,我在这里所做的是在创建类的对象后立即调用该方法。当然,这会起作用,但这是好的设计模式吗?
假设我不会从构造函数中调用该方法。所以,如果我们有下面的代码是一些其他的类:
ChopraChap7SeasonalFactorsCalculator calc = new ChopraChap7SeasonalFactorsCalculator();
calc.getDeseasonalisedData();
这将返回给我任何空数组列表。如何确保在访问任何字段之前调用该方法?
在我的情况下,最好的设计模式是什么?
【问题讨论】:
-
这个
getSales() { if(sales == null){// call here u r method}}怎么样 -
哇,好漂亮。我在某处读到,getter 用于此类额外代码,而不是简单地返回变量的值。赞成。你也可以添加这个作为答案吗?
-
Getter 应该获取当前值而不是进行复杂的初始化。想象一下,您添加了另一个方法,例如 public calculateSales(),它在内部使用 sales 字段而不调用 getter - 它会失败
-
有一个类似的问题; Can I call methods in constructor in Java? 那里接受的答案建议使用工厂模式。这可能是另一种选择。
标签: java design-patterns