代码之家  ›  专栏  ›  技术社区  ›  aioobe

是否被视为不良行为?如果是这样,在什么情况下,实例仍然是可取的?

  •  56
  • aioobe  · 技术社区  · 14 年前

    多年来,我一直试图避免 instanceof 只要可能。在适用的情况下使用多态性或访问者模式。我想它只是在某些情况下简化维护…还有什么其他的缺点需要注意吗?

    但是我在Java库中看到它,所以我认为它有它的位置。在什么情况下更可取?这是不可避免的吗?

    7 回复  |  直到 5 年前
        1
  •  10
  •   PhiLho    14 年前

    我可以想象一些情况,例如,您有一些库中的对象,这些对象不能扩展(或者这样做不方便),可能与您的一些对象混合在一起,所有对象都具有相同的基类,在一个集合中。
    我认为在这种情况下,使用instanceof来区分对这些对象的某些处理可能会很有用。

    在一些旧代码的维护中,您不能在许多旧类中注入一些新的行为,只是为了添加一个新的小特性或一些错误修复…

        2
  •  20
  •   Alexander Pogrebnyak    14 年前

    它在 equals . 例如。

    public boolean equals ( Object o )
    {
      if ( this == o )
      {
         return true;
      }
    
      if ( ! (o instanceof MyClass) )
      {
        return false;
      }
    
      // Compare fields
      ...
    }
    

    关于instanceof有一个很好的了解就是它的lhs可以 null 在这种情况下,表达式的计算结果为 false .

        3
  •  12
  •   Michael    7 年前

    我认为当你绝对需要知道一个物体的类型时, instanceof 是最好的选择。

    一个糟糕的做法是 运算符 s,一个接一个,并根据它们调用对象的不同方法(当然是强制转换)。 这可能反映出层次结构需要重新思考,可能需要重构。

        4
  •  5
  •   eljenso    14 年前

    当你进入纯OO模型时,那么 instanceof 绝对是一种代码味道。

    但是,如果您没有使用100%OO模型,或者您需要从外部向其中注入东西,那么instanceof或等价物( isXXX() , getType() ,…)可以有它的用途。

    一般的“规则”是尽可能避免,尤其是在 控制类型层次结构,例如可以使用子类型多态性。其目的不是询问对象是什么类型,并对其进行处理,而是直接或间接地通过访问者(本质上是双重多态性)询问对象以执行某些操作。

        5
  •  2
  •   bwawok    14 年前

    我同意它有臭味。很多例子,特别是在一个被锁在一起的街区,闻起来很糟糕。

    有时它会表现得像你想象不到的那样…我曾经发生过一件事:

    Class B extends A
    Class C extends A
    
    B b = new B();
    C c = new C();
    
    b instanceof B -> true
    b instanceof C -> true
    c instanceof C -> true
    c instanceof B -> true
    

    (在我的例子中,这是由于休眠生成代理对象导致的…。但是,如果代码dpending在instanceof上是有风险的)

        6
  •  1
  •   Joonas Pulakka    14 年前

    它可以在强制转换之前用作健全性检查;除了检查对象的类型是否正确之外,它还检查对象是否为空。

    if (o instanceof MyThing) {
        ((MyThing) o).doSomething(); // This is now guaranteed to work.
    } else {
        // Do something else, but don't crash onto ClassCast- or NullPointerException.
    }
    
        7
  •  0
  •   Thor    12 年前

    在创造工厂的情况下如何? 例如

    public static Cage createCage(Animal animal) {
      if (animal instanceof Dog)
        return new DogHouse();
      else if (animal instanceof Lion)
        return new SteelCage();
      else if (animal instanceof Chicken)
        return new ChickenWiredCage();
      else if (animal instanceof AlienPreditor)
        return new ForceFieldCage();
      ...
      else
        return new GenericCage();
    }