直到Java1.7,我很高兴地使用接口来实现OOP概念封装。意味着如果我想隐藏最终用户的实现,那么我将只与他们共享接口,他们可以使用该接口调用我的API,例如EJB。
以上在Java 8中有效,直到Java 1.7,我可以在接口中编写方法的实现以及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,其中说明了:
默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码具有二进制兼容性。
答案 0 :(得分:2)
我想说这些是我们在Java 8之前的其他功能
就像你说的那样,它是正确的 - 可以有默认和静态(仅适用于界面,不能覆盖。)
从oracle,当您扩展包含默认方法的接口时,您可以执行以下操作
- 根本不提及默认方法,它允许扩展接口继承默认方法。
- 重新声明默认方法,使其成为抽象。
- 重新定义默认方法,该方法会覆盖它。
醇>
所以我不知道该怎么称呼(部分封装与否),它们是默认实现,可以被覆盖。隐藏实际实现仍然是一个功能。
java.utils中的集合使用默认方法来支持lambda表达式。现在有些情况可以提供帮助。
在很多应用程序中我们需要一个基本实现类,然后我们扩展该类即BaseImplClass implements IsomeInterface
因此,您可以选择在您的界面中定义这些默认实现,而不是使用BaseImplClass。如果需要可以覆盖。
如果你有任何帮助器或实用程序类,你可以在接口...中使用静态方法,这些方法是公共的,最终的,不能被覆盖
现在如果你想到可能发生的钻石问题(如果一个类使用相同的默认方法签名实现多个接口,我们将会有不明确的情况。答案是否定的,在这种情况下你会在编译时遇到错误。你必须覆盖那个方法。
答案 1 :(得分:0)
答案1:我确信默认方法提供了部分封装。因为当我们将代码包装在一个类(现在可能在内部接口中)时,封装就在那里。它主要是一种抽象的现代方法,我们可以提供我们想要做的而不是我们想要做的事情。
答案2:这不是一个新问题,新手可能会比这更危险。我认为我们可以设置检查风格,不允许这样的方法。