【问题标题】:Is this a valid case to use instanceof operator?这是使用 instanceof 运算符的有效案例吗?
【发布时间】:2015-07-09 01:39:15
【问题描述】:

我是 Java 和 OOP 的初学者,我有一个关于 Java 继承的问题。

在我的项目中,我有一个类Order,它表示为资产下达的订单。我打算有几个扩展Order 的类,包括LimitBuyOrderLimitSellOrder 以及类似的市场订单。

我还将有一个类Position,它由一对订单组成。为了确定Position的类型,我必须知道首先输入了Order的类型。尽管instanceof 运算符可以在这种情况下工作,但我觉得这不是一个合适的解决方案。下面是一个精简的 sn-p,它可能有助于说明我的问题:

class Position {
    //Other fields and methods omitted for clarity
    public void open(Order o) {
        if(o instanceof LimitBuyOrder)
            //Set position type to LONG
        if(o instanceof LimitSellOrder)
            //Set position type to SHORT
    }
}

或者我应该在Order 中定义方法,例如isLimitBuy() & 等,这些方法返回false 并根据Order 扩展的子类覆盖它们以返回true

class Position {
    //Other fields and methods omitted for clarity
    public void open(Order o) {
        if(o.isLimitBuyOrder())
            //Set position type to LONG
        if(o.isLimitSellOrder())
            //Set position type to SHORT
    }
}

基本上,我的问题是如何正确确定子类的类型?提前致谢!

【问题讨论】:

  • 您的建议可行,但如果仅用于open 方法,那么您所拥有的也可以。
  • 为什么不将行为委托给Order 接口呢?我会尝试限制instanceof(s) 的数量,如果您必须确定某些内容是否可分配,您可以使用Class.isAssignableFrom(Class)
  • 以上述方式使用instanceof本身并没有错,但通常“O-O设计”会导致人们想要拥有Order的属性提供等效信息。 IOW,如果这是您需要区分的唯一地方,那么instanceof 可能是个好主意,但如果在其他情况下您需要特定类型的信息或操作,那么您应该考虑利用 O-O 的力量。
  • 这些方法本身并没有错误,但它们不是面向对象的。如果使用instanceof 方法,则每次添加新的Order 类型时都必须添加新的if 子句。如果你用第二种方法,你必须这样做 plus 为每个现有的Order 类型添加一个新的isXyzOrder() 方法。 Derek Hulley 的回答显示了多态、OO 方式。如果您以 OO 方式进行操作,添加新的 Order 类型不会影响其他任何内容。

标签: java oop inheritance instanceof


【解决方案1】:

您应该旨在将行为封装在订单类型中,而不是简单地在外部使用它们的类型来切换行为。

向您的“Order”类添加一个可以完成工作的方法,然后您根本不必知道它是什么类型:

order.openPosition(...);

让'Order'根据其类型做它需要做的任何事情。

封装的一个显着好处是您最终将所有特定于订单类型的行为集中在一个地方。抽象父类自然而然地提供了任何常见的顺序特征。将代码放在一个地方(或至少在一个小的类层次结构中),您可以更改行为,而无需访问整个应用程序的代码。

【讨论】:

  • 说得好。 1+ 删除我的答案以支持这个。
  • 你应该提到这是多态性的一个例子。
  • 虽然 OOP 仍然让我头晕目眩,但这个答案是有道理的。这样我就不用担心Order 的类型了。谢谢你们的帮助。
  • 很震惊 OP 的用户名不知何故没有被占用
猜你喜欢
  • 1970-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 2012-07-29
  • 2011-01-27
相关资源
最近更新 更多