我知道接口和类可以声明为抽象来避免这种情况。
但是,实现我们在接口中声明的所有方法有什么用吗?即使这些方法对该类不相关,如果我们继续定义所有方法,这是否会增加代码的复杂性和重量?为什么要这样设计呢?
Java中接口的概念非常类似于一个合约(也许事后看来这应该是这个概念的名称)
这个想法是,实现接口的类郑重承诺提供合同中列出的所有内容,以便任何使用实现接口的类的功能都有保证可用。
根据我的经验,正是这种机制使得在Java中建造大型系统成为可能。
UnsupportedOperationException
的实现。public interface WithOptionalMehtods {
void Optional1();
void Optional2();
boolean implementsOptional1();
boolean implementsOptional2();
}
public class Impl implements WithOptionalMehtods {
public void Optional1() {
System.out.println("Optional1");
}
public void Optional2() {
throw new UnsupportedOperationException();
}
public boolean implementsOptional1() {
return true;
}
public boolean implementsOptional2() {
return false;
}
}
public interface Part1 {
void Optional1();
}
public interface Part2 {
void Optional2();
}
public Impl implements Part1 {
public void Optional1() {
System.out.println("Optional1");
}
}
List
接口。除了所有检查列表内容的操作之外,它还具有十个可选操作来更改列表。 - Sergey Kalinichenko如果我们继续定义所有方法,即使它与该类无关,那么这不会增加代码的重量和复杂性吗?
是的,你说得对。这就是为什么在编码中遵循接口隔离原则是最佳实践,该原则建议不要强制客户端实现他们不使用的接口。因此,您永远不应该有一个“臃肿”的接口,其中包含许多方法,而是许多小接口,分组方法,每个组都服务于特定的行为或子模块。
这样,接口的客户端只实现所需的方法,而不会被迫实现他们不需要的方法。