gpt4 book ai didi

java - 区分不同处理的类类型的最佳方法

转载 作者:行者123 更新时间:2023-12-01 16:59:09 25 4
gpt4 key购买 nike

我想知道使用以下每种方式来区分主父类的子类并进行不同的处理有什么优点/缺点。我知道这是非常基本的,但我无法在任何地方找到这些方法之间的完整比较。

例如:- 我有一个 Payment super 抽象类和两个扩展类 OneTimePaymentSubscription- 我有一个方法 switchPaymentState 应该以不同的方式处理这些类型中的每一种

  • 选项 1:使用 instanceof

    public void switchPaymentState(Payment payment) {
    if(payment instanceof OneTimePayment) {
    //do something
    } else if(payment instanceof Subscription) {
    //do something else
    }
    }
  • 选项 2:使用枚举类型参数(或其他...)

    public enum PaymentType {
    ONE_TIME_PAYMENT,
    SUBSCRIPTION;
    }
    public abstract Payment(PaymentType type) {
    this.type = type;
    }
    public OneTimePayment() {
    super(ONE_TIME_PAYMENT);
    }
    public Subscription() {
    super(SUBSCRIPTION);
    }

    然后:

    public void switchPaymentState(Payment payment) {
    switch(payment.type) {
    case ONE_TIME_PAYMENT:
    //do something
    break;
    case SUBSCRIPTION:
    //do something
    break;
    }
    }
  • 选项 3:使用重载方法

    public void switchPaymentState(OneTimePayment payment){
    //do something
    }
    public void switchPaymentState(Subscription payment){
    //do something
    }

那么,哪一个是最好的方法(或者完全不同的方法?),为什么?

编辑:我需要根据类类型执行的操作不是对类本身的操作,我需要从付款中获取一些数据并通过其他服务发送它,因此解决方案例如在类内实现此功能并调用它,而不管类型,不幸的是在这种情况下没有帮助。谢谢!

最佳答案

最模块化的方法是使用重写。

您将拥有一个 switchPaymentState 方法,该方法接受基本类型 - Payment - 并调用 Payment 类中的方法来进行处理。该方法可以在 Payment 的每个子类中重写。

public void switchPaymentState(Payment payment)
{
payment.handlePayment();
}

您的 switchPaymentState 方法不必知道存在哪些 Payment 子类,并且如果您明天添加新子类,也不必更改它。

关于java - 区分不同处理的类类型的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29095708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com