Java接口有什么意义?

What is the point of a Java interface?

本问题已经有最佳答案,请猛点这里访问。

在我从零开始构建的所有新应用程序中,我从未见过需要接口,我以前读过文本,后来忽略并忘记了真正的需求。

也就是说,这里有一个我以前见过的问题,我将用这个问题来举例…

假设我有这个接口:

1
2
3
4
5
6
7
public interface IBox
{
    public void setSize(int size);
    public int getSize();
    public int getArea();
    //...and so on
}

我有一个实现它的类:

1
2
3
4
5
public class Rectangle implements IBox
{
    private int size;
    //Methods here
}

使用方法如下:

1
2
3
4
5
6
public static void main(String args[])
{
    Rectangle myBox=new Rectangle();
    // do stuff.
    System.out.println( myBox.getSize() );
}

假设我仍然需要在Rectangle类中编写setSize GetSize GetArea方法。考虑到使用这些方法的矩形,即使没有IBox接口也可以工作。

除了公开、命令或描述setSize getSize getArea方法之外,拥有IBox接口还有什么意义?


好吧,我们不要直接回答。假设我们有一个静态方法scaleBox(),它接受一个盒子并缩放它。显然,HexagonalBox不会延长Rectangle。我们需要一个scaleBox(HexagonalBox h)和一个scaleBox(Rectangle r)。我们可以让这两个框实现IBox,并有一个方法,scaleBox(IBox box)。该方法保证为setSize()

由于接口是一种类型,所以可以有许多类不相互扩展来实现该接口,并且可以安全地传递(因为它们保证遵守接受接口作为参数时所期望的约定)。

关于明年JDK8的相关注释,您将需要专门设计的接口,以便在新版本中使用lambda特性。


你的例子很好。如果您希望代码与其他类型的框一起工作,那么您所遗漏的就是可能发生的事情。如果您硬编码Rectangle,那么几乎不可能添加其他规范,如Square(假设Square)足够专门化,可以自己实现)。请考虑以下几点:

1
2
3
4
public void DoSomethingWithBox(Rectangle box)
{
    // Do something with the box.
}

现在,如果你想要一个正方形的话,你必须写一个超负荷的东西。或者,您可以简单地让RectangleSquare实现接口,这意味着您可以将单个方法更改为:

1
2
3
4
public void DoSomethingWithBox(IBox box)
{
    // Do something with the box.
}

它现在可以被任何实现你的IBox接口的东西调用。