比 Java 中的 If(x instanceof y) 更好的方法?

Better way then If(x instanceof y) in Java?

我有这些代码行:

    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 是下面所有 class 的超 class(抽象)。在这种方法中,我只想 return 字符串中的 "a" class 是什么。

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

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

public interface BankAccount {

    String getAccountType();

    ... whatever else ...
}

然后

public class RegularAccount implements BankAccount {

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

    ... whatever else ...
}

如果BankAccount是一个class那么就把它变成一个抽象方法。

在抽象class中放入一个字符串class成员并覆盖它的getter实现中的方法到return具体类型:

public abstract class BankAccount{
    String accountType;

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

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

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
}

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

考虑这样一种情况,您的经理要求您添加两个额外的备用帐户类型(AccountXAccountY),并要求您删除 StateLawAccount(出于某些原因) .您不仅需要在代码中为帐户类型 AccountXAccountY 添加新的 classes 并删除现有的 StateLawAccount,而且您还必须记住这unrelated class 有一个巨大的 if/else 检查银行账户类型。如果你忘了它,那么你已经在你的软件中插入了一个新的错误。