instanceof关键字用法

aps*_*aps 10 java instanceof

是否使用instanceof关键字反对的本质object oriented programming?我的意思是这是一个糟糕的编程习惯吗?我在某处读到使用instanceof关键字意味着设计可能不那么好.有更好的解决方法吗?

tho*_*att 14

一般来说是的.最好保留所有依赖于该类中特定类的代码,并且instanceof通常意味着您已经在该类之外放置了一些代码.

看看这个非常简单的例子:

public class Animal
{
}

public class Dog extends Animal
{
}

public class Cat extends Animal
{
}

public class SomeOtherClass
{
  public abstract String speak(Animal a)
  {
    String word = "";

    if (a instanceof Dog)
    {
      word = "woof";
    }
    else if (a instanceof Cat)
    {
      word = "miaow";
    }

    return word;
  }
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我们希望所有特定于狗的行为都包含在Dog类中,而不是传播到我们的程序中.我们可以通过重写我们的程序来改变它:

public abstract class Animal
{
  public String speak();
}

public class Dog extends Animal
{
  public String speak()
  {
    return "woof";
  }
}

public class Cat extends Animal
{
  public String speak()
  {
    return "miaow";
  }
}

public class SomeOtherClass
{
  public String speak(Animal a)
  {
    return a.speak();
  }
}
Run Code Online (Sandbox Code Playgroud)

我们已经指定Animal必须有一个speak方法.现在SomeOtherClass不需要知道每种动物的具体细节 - 它可以将其交给子类Animal.

  • ......继续......此外,我可能还有另一个名为Human的课程,它以不同于Mouse课程的方式对不同的动物作出反应.我可能会添加其他一百个以不同方式对不同动物做出反应的课程.没有instanceof可以处理这种情况吗? (3认同)
  • 另外一点:正如在这个回答中所说的那样,`instanceof`的问题是你需要指定子类型.如果亚型发生变化怎么办?然后你需要重写`instanceof`测试.但是如果你使用动态绑定和多态,它将没有任何区别,它仍然可以工作. (2认同)