我应该在这种情况下使用instanceof还是我需要使用多态

时间:2014-10-28 17:39:50

标签: java inheritance polymorphism instanceof

假设我有一个帐户类

public class Account {
   void Print();
}

我从它派生了两个子类,即SavingsAccount和CheckingAccount。

public class SavingsAccount extends Account{
   void Print();
}

public class CheckingAccount extends Account{
   void Print();
}

现在假设我有一个驱动程序类,可以说SimulateAccounts有一个类型为Account的数组列表,

public class SimulateAccounts{
   ArrayList<Node> myAccounts = new ArrayList<Node>();
   void simulate()
   { //suppose some function has added added 5 savingAccounts and 10 checkingsAccounts in myAccounts arraylist

   }

现在我的问题是我想在上面的模拟函数中找到arraylist myAccounts中的savingAccounts和checkingAccounts类型的计数,我可以通过使用instanceof函数来做到这一点。但是我对使用它感到困惑,因为我已经阅读了很多地方使用instanceof是不好的做法和代码味道,所以我如何将多态融入其中以避免使用instanceof或者可以使用它。此外,如果我使用的实例以及将来saveCount帐户更改的名称,我还需要在模拟功能中更新我的代码!那我该怎么办呢 感谢

2 个答案:

答案 0 :(得分:1)

如果您正在使用C#(您的命名约定同时表示Java和C#),则可以使用.OfType<CheckingAccount>().Count

但是请确保,继续使用instanceof。这并不是为什么应该谨慎使用它,当你定义子类特定的行为而不在类本身提供实现时。

例如:

if(account instanceof CheckingAccount)
{
    // Do something
} else if(account instanceof SavingsAccount) {
    // Do another thing
}

相反
account.DoAccountTypeSpecificThing();

你想做的事情是有意义的。

答案 1 :(得分:0)

您可以使用enum来避免instanceof

public enum AccountType
{
   Check, Saving
}


public class Account 
{
   void Print();
   AccountType getAccountType();
}

public class SavingsAccount extends Account
{
  void Print(){};

  AccountType getAccountType()
  {
     return AccountType.Saving;
  }
}

public class CheckingAccount extends Account
{
  void Print(){};

  AccountType getAccountType()
  {
     return AccountType.Check;
  }
}

现在,如果您想知道Account实例的类型:

Account a = ...

switch(a.getAccountType())
{
 case Check:
   // do something specific to checking account
   break;

 case Saving:
   //do something specific to saving account
   break;

 default:
   break;
}

顺便说一下,在我看来,使用extends继承类比使用instanceof更糟糕。