从灵活性的角度来看,接口非常棒.但万一,大量客户端使用接口.在保持旧的mehtod完整性的同时向接口添加新方法将破坏所有客户端的代码,因为客户端中不会出现新方法.如下所示:
public interface CustomInterface {
public void method1();
}
public class CustomImplementation implements CustomInterface {
@Override
public void method1() {
System.out.println("This is method1");
}
}
Run Code Online (Sandbox Code Playgroud)
如果在某个时间点,我们在此接口中添加另一个方法,所有客户端的代码都会中断.
public interface CustomInterface {
public void method1();
public void method2();
}
Run Code Online (Sandbox Code Playgroud)
为避免这种情况,我们必须在所有客户端代码中明确实现新方法.
所以我认为接口和这个场景如下:
编辑:Default方法确实是Java接口的一个很好的补充,很多人在他们的答案中提到过.但我的问题更多的是在代码设计的背景下.如何在客户端上强制实现方法是接口的固有特性.但是,接口和客户端之间的这种合同似乎很脆弱,因为功能最终会发展.
Era*_*ran 21
Java 8中以接口中的默认方法的形式引入了该问题的一种解决方案.它允许在不破坏现有代码的情况下向现有Java SE接口添加新方法,因为它为所有新方法提供了默认实现.
例如,Iterable广泛使用的接口(它是接口的超级Collection接口)添加了两个新的默认方法 - default void forEach(Consumer<? super T> action)和default Spliterator<T> spliterator().
Sha*_*aiz 18
public interface CustomInterface {
public void method1();
}
public interface CustomInterface2 extends CustomInterface {
public void meathod2();
}
Run Code Online (Sandbox Code Playgroud)
除了默认方法之外,您可以使用继承属性,如上所示,新接口将具有所有先前方法以及新方法,并在您所需的情况下使用此接口.
Java 8引入了方法的默认实现.这些实现驻留在接口中.如果在已经由许多类实现的接口中创建具有默认实现的新方法,则不需要修改所有类,而只需要修改我们希望为新定义的方法具有不同实现的类.默认一个.
现在,旧的Java版本呢?在这里,我们可以有另一个扩展第一个的接口.之后,我们想要实现新声明的方法的类将被更改为实现新接口.如下所示.
public interface IFirst {
void method1();
}
public class ClassOne implements IFirst() {
public void method1();
}
public class ClassTwo implements IFirst() {
public void method1();
}
Run Code Online (Sandbox Code Playgroud)
现在,我们想要method2()声明,但它应该只能通过实现ClassOne.
public interface ISecond extends iFirst {
void method2();
}
public class ClassOne implements ISecond() {
public void method1();
public void method2();
}
public class ClassTwo implements IFirst() {
public void method1();
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这种方法都可以,但它也有缺点.例如,我们想要method3()(并且只有那个)ClassTwo.我们需要一个新的界面IThird.如果稍后我们想要添加method4()应该由ClassOne和ClassTwo实现,我们将需要修改(但不是ClassThree那样implemented IFirst)我们将需要更改两者ISecond和IThird.
在编程方面,很少有"神奇的子弹".在接口的情况下,最好不要更改.在现实生活中并非总是如此.这就是为什么建议接口只提供"合同"(必须具有的功能),并在可能的情况下使用抽象类.
未来的接口更改不应该破坏任何已经工作的东西 - 如果有的话,它是一个不同的接口.(它可能会弃用某些东西,并且在弃用之后需要一个完整的循环,可以接受的是,抛出未实现的异常是可以接受的.)
要向界面添加内容,最简洁的答案是从中派生新界面.这将允许使用实现新行为的对象和期望旧代码的代码,同时允许用户适当地声明和/或类型转换以访问新功能.它有点烦人,因为它可能需要instanceof测试,但它是最强大的方法,它是许多行业标准中你会看到的方法.
| 归档时间: |
|
| 查看次数: |
1413 次 |
| 最近记录: |