【问题标题】:Abstract class avoid creating multiple instances of object to pass different inputs抽象类避免创建多个对象实例来传递不同的输入
【发布时间】:2020-02-17 20:55:40
【问题描述】:

我正在尝试使用抽象类重构一个类,并试图了解我的方法是否正确。

对于我收到的每个对象,我都有一个基本验证器,它执行一些基本检查,然后有一个自定义验证器,它根据对象类型执行一些额外的验证。我觉得这是对抽象类的一个很好的使用。

public abstract class Validator {
    BaseValidator baseValidator;
    abstract void customValidation();

    void validateObject() {
        baseValidator.validate(getInputObject());
        customValidation();
    }

    abstract String getInputObject();
}

public TypeAValidator extends Validator {
    @Override
    public void customValidation() {
        //Do something with getInputObject();
    }

    @Override public String getInputObject() {
        return "someInput";
    }
}

我不认为将每个输入都作为 getter 的一部分似乎是正确的方法。如果我采用非抽象类方法,我会这样做:

public TypeAValidator {
    BaseValidator baseValidator;

    public void validateObject(String inputObject) {
        baseValidator.validate(inputObject);
        customValidation(inputObject);
    }
}

使用这种方法,我需要做的就是调用typeAValidator.validateObject(inputObject),而无需每次都创建TypeAValidator 的新实例,而我需要使用抽象类方法来执行此操作。我为抽象类建模的方式有问题吗?

【问题讨论】:

  • 我不确定我是否正确理解了您的问题,如果我错了,请纠正我。您想为特定类型的数据实现 Validator,并且必须对每种类型共同执行一些检查,所以您想将这些检查委托给一个公共基类?
  • @JanHeld 是的,没错。我也只想创建一个 TypeAValidator 实例。
  • 好的,您是否有多个子类需要检查,例如ClassA 的子类 ClassB 和 ClassC 以及 ClassB 的 TypeValidator 与 ClassC 的 TypeValidator 不同,但都共享 BaseValidator 中实现的公共检查?
  • 一般每个TypeValidator只需要检查一个类型。
  • 好的,希望最后一个问题:要检查的类是否共享一些公共基类?所以 BaseValidator 可以检查 BaseClass 中的所有内容,TypedValidatorA 检查 SubClassA 中的所有内容,TypedValidatorB 检查 SubClassB 中的内容,或者要检查的类如何相关?

标签: java oop abstract-class


【解决方案1】:

你可以混合你自己的两种解决方案来制作这样的东西

public abstract class Validator {
    BaseValidator baseValidator;

    protected abstract void customValidationOnObject(String inputObject);

    public void validateObject(String inputObject) {
        baseValidator.validate(inputObject);
        customValidationOnObject(inputObject);
    }
}

class TypeAValidator extends Validator{

    @Override
    protected void customValidationOnObject(String inputObject) {
        // custom validate the Object
    }
}

您可以在单个 TypeAValidator 对象上调用 TypeAValidator.validateObject(inputObject)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    相关资源
    最近更新 更多