【发布时间】:2015-03-17 09:39:34
【问题描述】:
我想知道使用以下每种方法来区分主父类的子类并以不同方式处理它们的优点/缺点是什么。我知道这是非常基本的,但我无法在任何地方找到这些方式之间的完整比较。
例如: - 我有一个 Payment 超级抽象类和两个扩展类 OneTimePayment 和 Subscription - 我有一个方法 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 方法的行为会根据实例类型有所不同,但结果几乎相同。在这种情况下,我认为重载是一个不错的选择:)
标签: java types enums overloading instanceof