【发布时间】:2015-12-26 09:03:23
【问题描述】:
从灵活性的角度来看,接口很棒。但是,如果一个接口被大量客户端使用。在保持旧方法完整的同时向接口添加新方法将破坏所有客户端的代码,因为新方法不会出现在客户端中。如下图:
public interface CustomInterface {
public void method1();
}
public class CustomImplementation implements CustomInterface {
@Override
public void method1() {
System.out.println("This is method1");
}
}
如果在稍后的某个时间点,我们向此接口添加另一个方法,所有客户端的代码都会中断。
public interface CustomInterface {
public void method1();
public void method2();
}
为避免这种情况,我们必须在所有客户端的代码中显式实现新方法。
所以我认为接口和这个场景如下:
- 曾经编写过的界面就像在石头上雕刻一样。他们很少被认为,并且期望改变。如果他们这样做了,他们会付出巨大的代价(重写整个代码),程序员应该为此做好准备。
- 继续上面的观点,是否可以编写经得起时间考验的接口?
- 如何在您期望将来有更多功能的接口中处理这种情况?这就是预期约束所有客户的合同的变化。
编辑:Default 方法确实是对许多人在回答中提到的 Java 接口的一个很好的补充。但我的问题更多是在代码设计的背景下。以及如何强制客户端上的方法实现是接口的固有特征。但是接口和客户端之间的这种契约似乎很脆弱,因为功能最终会发展。
【问题讨论】:
-
阅读建议:框架设计指南(它是 .net,但它也是 Java 程序员的好读物)有一节关于在类或接口之间进行选择。正如其他答案所述,他们也谈论使用类,因为它们比接口灵活得多,并且可以让您在不破坏客户端代码的情况下对其进行改进。