如何识别数组接口中的实例?

时间:2013-11-29 16:58:39

标签: java interface

我有一个名为“Shape”的接口和2个实现它的类(Circle,Square)。 我还有一个ShapeShape shapes=new Shape[20])数组。

我如何知道特定单元格中的哪个形状(CircleSquare) (哪个形状在shapes[0]shapes[1]等等......)?

4 个答案:

答案 0 :(得分:3)

如@jwa所述,您可以使用instanceof来检查类型。根据实际类型处理形状的经典解决方案是访客模式:

interface Shape {
    accept(ShapeProcessor processor);
}

class Circle implements Shape {
    accept(ShapeProcessor processor) {
        processor.visit(this);
    }
}

class Squere implements Shape {
    accept(ShapeProcessor processor) {
        processor.visit(this);
    }
}

interface ShapeProcessor {
    visit(Circle circle);
    visit(Squere squere);
}

答案 1 :(得分:1)

您可以使用instanceof语法检查对象是否是特定类的实例。这允许您根据其形状执行不同的操作:

for(int i = 0; i < shapes.length; i++) {
    if (shape[i] instanceof Circle) {
        System.out.println("Shape " + i " is a Circle");
    } else if (shape[i] instanceof Square) {
        System.out.println("Shape " + i " is a Square");
    }
}

或者,如果您不需要针对每种类型执行特定操作,并且您只想列出它们:

for(int i = 0; i < shapes.length; i++) {
    System.out.println("Shape " + i " is a " + shapes[i].getClass());
}

答案 2 :(得分:0)

正如@Thomas所指出的,你通常不应该在意。这个想法是所有实例都实现一个接口或扩展一个公共类。你应该把它们想象成形状。

如果你想绘制它们,可以通过赋予每个类实现的Shape draw(canvas)方法将此责任放在类中。现在,您可以轻松添加更多形状而不会破坏当前代码。每个形状都知道如何画出自己。

你可以使用@jwa提供的回答实例。但在面向对象语言中,instanceof实际上是一种代码味道。

有关代码气味的实例的信息:http://smsohan.blogspot.nl/2011/11/using-instanceof-is-mostly-code-smell.html

一般代码嗅觉信息:http://en.wikipedia.org/wiki/Code_smell

答案 3 :(得分:0)

简单而又丑陋的选择是使用instanceof运算符,如另一个答案中所述。但是,请考虑是否可以向Shape添加抽象方法来执行您需要执行的操作。

对于更复杂的情况,此方法实际上可能是工厂方法,并返回另一个抽象类或接口(如interface ShapeTransformer的(私有子类)的实例,而Circle类将具有private class CircleTransformer implements ShapeTransformer

或使用另一个答案中解释的访客模式。

细节实际上取决于你想做什么。对于一些案例,使用instanceof的if-elseif阶梯很好,只要你意识到如果代码的寿命比你预期的要长,它就会回来了。