【问题标题】:Better way then If(x instanceof y) in Java?比 Java 中的 If(x instanceof y) 更好的方法?
【发布时间】:2016-02-26 02:55:51
【问题描述】:

我有这几行代码:

    public String getAccountType(BankAccount a){
       if(a instanceof RegularAccount)
           return "RA";
       else if(a instanceof SavingsAccount)
           return "SA";
       else if(a instanceof cityAccount)
           return "CLA";
       else if(a instanceof StateLawAccount)
           return "SLA";
       else if(a instanceof FederationLawAccount)
           return "FLA";
       else
           return null;
    }

BankAccount 是下面所有类的超类(抽象)。在这个方法中,我只想返回一个字符串中的“a”类。

但是,我想知道除了这堆if/else 语句之外,是否有更好的方法来验证“a”类。有吗?我可以用 switch 语句来做吗?如果有,怎么做?

【问题讨论】:

  • 知道是哪个类的目的是什么?
  • 使用 OOP 并在您的每个 Account 类中定义 getAccountType
  • 签出this

标签: java if-statement abstract superclass instanceof


【解决方案1】:

BankAccount 上放置一个抽象方法getAccountType(),然后让实现返回帐户类型字符串。这是一个假设BankAccount 是一个接口的示例:

public interface BankAccount {

    String getAccountType();

    ... whatever else ...
}

然后

public class RegularAccount implements BankAccount {

    @Override
    public String getAccountType() { return "RA"; }

    ... whatever else ...
}

如果BankAccount 是一个类,那么就让它成为一个抽象方法。

【讨论】:

    【解决方案2】:

    在您的情况下,我将在 BackAccount 类中添加一个抽象方法 getAccountType (),并在每个具体类中实现它,以便它们返回正确的帐户类型。

    public abstract class BankAccount {
        public abstract String getAccountType ();
    
        // Rest of implementation
    }
    
    public class RegularAccount extends BankAccount {
        private static final String ACCOUNT_TYPE = "RA";
    
        @Override
        public String getACcountType () {
            return ACCOUNT_TYPE;
        }
    
        // Rest of implementation
    }
    

    没有比您随问题提供的代码示例更简单的方法来比较对象的类了。但是,如果您最终不得不在代码中执行此操作,那么您应该检查您当前的设计。

    假设您的经理要求您添加两个额外的回退帐户类型(AccountXAccountY),并要求您删除 StateLawAccount(出于某些原因)。您不仅需要在代码中为帐户类型 AccountXAccountY 添加新类,并删除现有的 StateLawAccount,而且您还必须记住,这个不相关的类有一个巨大的 if/else 来检查银行账户类型。如果您忘记了它,那么您已经在您的软件中插入了一个新错误。

    【讨论】:

      【解决方案3】:

      在抽象类中放置一个字符串类成员,并在实现中覆盖其getter方法以返回特定类型:

      public abstract class BankAccount{
          String accountType;
      
          public abstract String getAccountType(){
              return accountType;
          }
      }
      

      【讨论】:

      • accountType 不应该是成员,因为它与类相关联,而不是与类的实例相关联。
      • @WillieWheeler,真的,对于 OP 所要求的绝对是什么,只是一种方法就足够了。但是如果accountType是每个账户的一个属性,最好是泛化的成员。
      • 您的建议不是重载——它是覆盖。如果您需要 getAccountType 被每个具体帐户类覆盖,您应该将其设为 public abstract String getAccountType();
      • -1 因为此解决方案允许相同类型的不同帐户实例具有不同的帐户类型字符串。此外,每个帐户实例都必须存储相同的字符串,这不是必需的。
      • @WillieWheeler 感谢您的评论,但我没有看到这个要求。而且,这是要解决的思路,不是复制粘贴的解决方案。
      猜你喜欢
      • 1970-01-01
      • 2020-08-02
      • 2018-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2017-07-15
      • 1970-01-01
      相关资源
      最近更新 更多