Java instanceof是一个好的实践吗?

Java instanceof是一个好的实践吗?,java,oop,enums,Java,Oop,Enums,我有一个从基类扩展而来的对象列表。现在我只想在列表中的一个类实例上应用一个特定的操作 使用instanceof是否是一种良好的做法?或者我应该通过自定义enum来区分对象吗 abstract class Base; class Foo extends Base; class Bar extends Base; List<Base> bases; for (Base base : bases) { if (base instanceof Bar.class) { //

我有一个从基类扩展而来的对象列表。现在我只想在列表中的一个类实例上应用一个特定的操作

使用
instanceof
是否是一种良好的做法?或者我应该通过自定义
enum
来区分对象吗

abstract class Base;
class Foo extends Base;
class Bar extends Base;

List<Base> bases;

for (Base base : bases) {
  if (base instanceof Bar.class) {
     //execute my custom operation on the base object
     doSomething((Bar) base);
  }
}
抽象类库;
类Foo扩展了基;
类条扩展基;
列出基础;
用于(基础:基础){
if(Bar.class的基本实例){
//在基本对象上执行我的自定义操作
剂量测定法((巴)基);
}
}
如果这种方法总体上不是很好,我怎么能做得更好呢//抽象函数doSomething()
abstract class Base;//abstract function doSomething()
class Foo extends Base;//implements doSomething()
class Bar extends Base;//dito

List<Base> bases;

for (Base base : bases) {
     base.doSomething();
}
类Foo扩展了基//实现doSomething() 类条扩展基//迪托 列出基础; 用于(基础:基础){ 基础。doSomething(); }
回答您的问题:使用instanceof不是一个好主意。

这里似乎没有任何理由使用instanceof。让基类将行为默认为“不做任何事情”,并在需要时在扩展类时重写它,这可能是有意义的。这样,您只在需要时覆盖它(I on.y将其作为一个抽象类,后面是这个示例不需要的问题)。 例如:

abstract class Base{
    public void doSomething(){}
}

public class B0 extends Base{
    @Override
    public void doSomething(){//actually do something}
} 

public class B1 extends Base{}
使用此选项的示例如下:

public class SomeOtherClass{
    public void something(List<Base> bases){
         for(Base base:bases)
             base.doSomething();
    }
}
public类SomeOtherClass{
公开作废某物(列表基数){
用于(基础:基础)
基础。doSomething();
}
}

的实例在这里不是一个好的做法

正确的解决方案将取决于
doSomething
方法内部到底发生了什么。 如果你按照自己的方式去做,那么除了其他事情之外,你违反了。我假设您决定首先需要这些层次结构是因为某种原因,并且我还假设子类型具有比doSomething方法更多的行为。在这种情况下,您可以执行的操作如下所示。基本上,只有那些应该
doSomething
的类型才真正做到了这一点,其余的类型都做了类似
no operation
的事情。通过这种方式,您可以使用这些对象,而无需知道它们实际上是什么类型

您还应该问问自己是否真的需要基类成为抽象类。也许你只需要一个界面。也许有更好的方法,但根据我掌握的信息和我的假设,这似乎是正确的

public abstract class Base
{
    public abstract void doSomething();

    public void someOtherMethod()
    {
        // which does stuff
    }
}

public class SubTypeWhichCanDoSomething extends Base
{
    @Override
    public void doSomething()
    {
        // actually implement method and DO something
    }
}

public class DoesNothing extends Base
{
    @Override
    public void doSomething()
    {
        // does nothing
        return;
    }
}

// then your code looks like these
for(Base base : bases)
{
    base.doSomething();
}

使用多态性;这就是它存在的原因。确切地说,您应该实现一些base.doSomething(),而不是doSomething(base),它在foo.doSomething()中被重写。Google多态性java-or-override方法java。我喜欢这个特别的答案:。我意识到C++和java是不同的,但是“无论何时你发现自己编写了表单的代码”,如果对象是T1类型的,那么就做一些事情,但是如果是T2类型的,那么做其他的事情,“给自己一记耳光。如果你在添加要检查的枚举和使用instanceof之间做出选择,后者更好,因为它与枚举告诉你的信息相同。正如其他人所说,多态性是Java的标准解决方案。然而,在许多情况下,您调用的代码并非都在您的控制之下,使用instanceof是完全可以的。因此,真正的答案是:这取决于您在哪里使用它,以及是否有不需要您检查预定义类列表的替代方案。。你不必使用错误的语法,它应该是“
base instanceof Bar
”为什么你要使用instanceof而不是一个好主意???@SajitKunnumkal:copy and paste bug。当然不需要了!这是一个非常好的想法,因为我可以省略类的实现,而这些类在方法调用中应该什么都不做。