【发布时间】:2023-03-09 22:20:01
【问题描述】:
直到 Java1.7,我很高兴我使用接口来实现 OOP 的概念封装。意味着如果我想对最终用户隐藏实现,那么我将只与他们共享接口,他们可以使用该接口调用我的 API,例如 EJB。
以上在 Java 1.7 之前有效,现在在 Java 8 中,我可以在接口中编写方法的实现,也可以使用 default 和 static 关键字,例如:
public interface Foo {
public abstract int someUnimplementedMethod();
default void printMsg() {
System.out.println("Hello...!");
}
static void sayHello() {
System.out.println("Hello...!");
}
}
这在 Java 1.8 中完全有效。
现在我的问题是:
在 Java 8 中,我们是否尝试通过
default和static方法引入称为 部分封装 的东西?我知道你们中的一些人会争辩说,如果你不想共享实现,那么最好在子接口中提供
default和static实现,并使用抽象方法保留父接口,但现在不是当然,如果我用抽象方法编写了一个接口,新手可能只在接口中编写整个实现。所以它提出了一个问题,最好不要在接口中实现方法。
如果您不同意我的第二点,请提供解决方案。
顺便说一句,我读过Java documentation,其中指出:
默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
【问题讨论】:
-
你仍然不能在接口中有字段,所以你不能有状态,这也意味着封装真的与接口的变化无关。
-
@LouisWasserman 请在答案部分详细说明您的评论或提供一些有用的链接,您所说的“封装与界面的更改实际上无关”的意思,它会有所帮助。谢谢..
-
“Java1.7,很高兴我使用接口来实现 OOP 概念封装” ...很好奇,因为接口真的与封装或数据隐藏没有任何关系直接。
-
“在 Java 8 中,我们是否试图通过默认和静态方法引入称为部分封装的东西?” ...默认方法是达到目的的一种手段:一种方法在不破坏数十年的现有代码的情况下发展遗留的 Java 接口。默认方法确实在 Java 中引入了更多的多重继承,特别是实现(或行为)的多重继承。 Java 仍然禁止状态的多重继承。