簡體   English   中英

從Java的構造函數內部調用私有方法

[英]Calling private methods from inside the constructor in Java

我有以下課程:

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

這將返回任何空數組列表。 如何確保在訪問任何字段之前調用該方法?

就我而言,最佳的設計模式是什么?

當然,這會起作用,但這是一種好的設計模式嗎?

這是一個非常正確的設計。 您可以將構造函數邏輯的一部分委托給私有方法,以使事情更清楚。

這將返回任何空數組列表。 如何確保在訪問任何字段之前調用該方法?

您擔心有人會在構造函數中進行某些更改可能適用於任何方法或代碼塊。
但是,應用程序並非旨在檢查每個組件是否達到了我們的期望。 這是單元測試角色,用於斷言實際行為是預期的行為。

因此,為ChopraChap7SeasonalFactorsCalculator構造函數編寫一個單元測試,並在此測試中斷言,一旦創建對象,所有吸氣劑都會返回期望值。
如果有人以錯誤的方式修改了構造函數,則測試將失敗,構建也將失敗。 您可以通過自己的方式確保一切都按預期進行。

我認為那很好。 構造函數在那里創建有用的對象。 如果確定沒有設置這些對象就無法使用該對象,則沒有理由不在構造函數中進行設置。

如果您檢查https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

一個類包含構造函數,這些構造函數被調用以根據該類藍圖創建對象。

您已經添加了字段,但是沒有設置這些字段就沒有工作對象,而且顯然您已經知道這些值。 最好的方法是將這些保留在構造函數中。 如果有一些未知的值或要求來創建該類的實例,則可以考慮使用Factory模式或其他方式,但是在這種情況下,使用構造函數就可以了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM