可以说我有类DrugAmount:

package core;

public abstract class DrugAmount {

    boolean drugInMg = false;
    boolean drugInMl = false;
    double numberofAmpoules = 0.0;
    double ampoulesInML = 0.0;
    double ampoulesInMG = 0.0;

    public DrugAmount() {
    }

    public DrugAmount(int numberOfAmpoules) {
        setNumberofAmpoules(numberOfAmpoules);
    }

    // SETTER:

    private void setNumberofAmpoules(int numberOfAmpoules) {
        this.numberofAmpoules = numberOfAmpoules;
    }

    // GETTER:

    public double getNumberOfAmpoules() {
        return numberofAmpoules;
    }

    public double getAmpoulesInML() {
        return ampoulesInML;
    }

    public double getAmpoulesInMG() {
        return ampoulesInMG;
    }

    public boolean isDrugInMl() {
        return drugInMl;
    }

    public boolean isDrugInMg() {
        return drugInMg;
    }

}


以及类DrugAmountMg:

package core;

public class DrugAmountMg extends DrugAmount {

    public DrugAmountMg(double drugAmount) {
        super();
        setDrugInMg();
        setAmpoulesMG(drugAmount);
        setNumberOfAmpoules();
        turnDrugFromMgToMl();
    }

    public DrugAmountMg(int drugAmount) {
        super(drugAmount);
        setDrugInMg();
        setAmpoulesMG();
        turnDrugFromMgToMl();
    }

    private void setNumberOfAmpoules() {
        numberofAmpoules = ((1 / Ampoule.AMOUNT_OF_ONE_AMPOULE_IN_MG) * getAmpoulesInMG());
    }

    private void setAmpoulesMG() {
        ampoulesInMG=(Ampoule.AMOUNT_OF_ONE_AMPOULE_IN_MG*getNumberOfAmpoules());
    }

    private void setAmpoulesMG(double drugAmount) {
        ampoulesInMG=drugAmount;
    }

    private void turnDrugFromMgToMl() {
        if (isDrugInMg()) {
            ampoulesInML=(Ampoule.AMOUNT_OF_ONE_AMPOULE_IN_ML / Ampoule.AMOUNT_OF_ONE_AMPOULE_IN_MG) * getAmpoulesInMG();
        }
    }

    private void setDrugInMg() {
        drugInMg = true;
    }
}


就像您看到的那样,类DrugAmount中存在“ package private”对象变量-这是一种好的Java做法吗?

还是应该将它们修改为private并在子类DrugAmountMg中声明新的对象变量,然后通过getter方法为它们分配DrugAmount-variables的值?

最佳答案

您可以按原样保留它们,但是您真的需要从同一包中不是子类的其他类访问它们吗?我会在基类中将它们设置为protected

您绝对不应在子类中声明新字段。这样,该类将在每个字段中都有两个字段(例如,drugInMg),即使子类的源代码中仅包含一个字段,但如果尝试执行以下操作,则可能会遇到麻烦通过反射设置私有字段,例如在单元测试中。在我正在从事的项目中,我们偶尔会遇到一些问题,其中一个类在类层次结构中的不同点具有声明为私有字段的相同类型和名称的字段,并且使用反射实用程序设置的单元测试专用字段失败,因为他们设置了错误的字段。

我不确定“通过getter方法为他们分配DrugAmount变量的值”是什么意思。我怀疑您的意思是您将使这些字段在基类中私有,创建getter,在子类中复制这些字段,并从基类中获取值以设置子级?同样,以这种方式复制字段不是一个好主意。

您可以做的另一件事是在基本类中将字段设置为私有,并提供getter和setter来允许子类更新字段,但这为外人调用setter创造了可能。您可以将setter设置为受保护或打包私有,但为什么不仅对实际字段进行保护?然后,只有子类可以访问它们。

09-30 21:25