Java - instanceof的替代方案?

时间:2013-05-20 07:32:28

标签: java recursion nested instanceof

我有一个Shape超类和一个NestedShape子类。 NestedShape子类具有嵌套在其中的ShapesList的ArrayList('Shapes')。我需要为NestedShape实现'包含'方法。当给定Shape对象时,此方法应检查NestedShape的{​​{1}}中是否存在该形状。我现在的实现非常简单:只需在ShapeList上调用ArrayList .contains()方法。

但是,我需要实现的“包含”方法还必须检查ShapesList中的任何NestedShape,该形状的ShapesList也不包含正在寻找。这样做的显而易见的方法是使用ShapeList检查instanceof中的每个Shape是否为ShapeList。然后,我猜我会递归调用我的'contains'方法,如果它是NestedShape。但是,我不确定这是否是一个很好的方法 - 我听说NestedShape的使用是不受欢迎的(同样,我不确定我使用递归的想法是否会起作用)。

有人能提出更好的方法来解决这个问题吗?

谢谢:)

3 个答案:

答案 0 :(得分:5)

使用多态:

public class Shape {

    public boolean contains(Shape shape) {
        return false;
    }
}

public class NestedShape extends Shape {
    private List<Shape> subShapes = new ArrayList<Shape>();

    @Override
    public boolean contains(Shape shape) {
        if (subShapes.contains(shape)) {
            return true;
        }
        for (Shape subShape : subShapes) {
            if (subShape.contains(shape)) {
                return true;
            }
        }
        return false;
    }
}

答案 1 :(得分:1)

两个想法:

  1. 不要让NestedShape延长Shape,而是单独处理它们。

  2. 让所有Shape成为'嵌套'。对于false,单个形状的返回始终为contains()

答案 2 :(得分:1)

如果

  • contains()方法的表现是您的关注点和
  • NestedShape是不可变的,这意味着一旦设置的嵌套Shape实例列表永远不会改变

然后我建议采用略有不同的方法。

不是递归迭代所有NestedShapes,而是可以在Set类中添加Shape,它将存储对所有NestedShape实例的引用。可以访问此Shape实例。