我知道这是接口的目的,并且可以将类声明为abstract以逃避它。
但是有没有用于实现我们在接口中声明的所有方法?如果我们继续定义所有方法,即使它与该类无关,那么这不会增加代码的重量和复杂性吗?为什么这么设计呢?
答案 0 :(得分:22)
Java中的接口的概念非常类似于契约(也许回想起来,这应该是概念的名称)
这个想法是实现接口庄严地承诺提供合同中列出的所有内容,以便任何使用实现界面的类保证以使该功能可用。
根据我的经验,这个设施是使用Java建造大教堂的可能性之一。
答案 1 :(得分:9)
你所批评的正是目标界面的实现。 如果您不想实现界面,请不要声明您的类实现它。
如果我们这样做,那将不会增加代码的重量和复杂性 继续定义所有方法,即使它与此无关 类?
当您针对接口进行编程时,您希望其背后的具体对象实现其所有方法。如果您的具体对象不需要或无法实现所有接口方法,则可能需要修复设计问题。
答案 2 :(得分:6)
当任何代码接收到接口的实例而不知道它背后是什么类时,应确保该代码能够调用接口中的任何方法。这使得接口成为调用者和功能提供者之间的契约。实现这一目标的唯一方法是要求所有实现接口的非抽象类为其所有函数提供实现。
有两种常规方法可以解决不实现某些功能的需要:
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");
}
}
答案 3 :(得分:1)
如果我们这样做,那将不会增加代码的重量和复杂性 继续定义所有方法,即使它与此无关 类?
是的,你是对的。这就是为什么在您的编码中 最佳做法 遵循建议不强制客户端实现接口的Interface Segregation Principle不要用。因此,您应该永远不会有一个“胖”界面与许多方法,但许多小接口分组方法,每个组服务于特定的行为或子模块。
这样,接口的客户端只实现所需的方法,而不必强制实现它们不需要的方法。
答案 4 :(得分:0)
可能取决于Liskov Substitution Principle
因此,拥有A implements B
意味着您可以在需要A
时使用B
,并且为了使其正常运行,A
必须至少具有相同的方法B
。
请记住,我的答案不是“正确的”,因为它不是基于官方消息来源!
答案 5 :(得分:0)
实现接口时,我们可能不需要定义接口中声明的所有方法。我们可以定义一些我们不需要的方法,在体内没有任何内容。