在Java 8中,Interface是否破坏了封装的概念?

时间:2016-02-14 17:43:05

标签: java oop interface java-8

直到Java1.7,我很高兴地使用接口来实现OOP概念封装。意味着如果我想隐藏最终用户的实现,那么我将只与他们共享接口,他们可以使用该接口调用我的API,例如EJB。

以上在Java 8中有效,直到Java 1.7,我可以在接口中编写方法的实现以及defaultstatic关键字,例如:

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中,我们是否尝试使用defaultstatic方法引入一些名为部分封装的内容?

  • 我知道有些人会争辩说,如果你不想分享实现,那么最好在子接口中提供defaultstatic实现,并使用抽象方法保持父接口,但现在不确定如果我用抽象方法编写接口,新手可能只在接口中编写整个实现。因此,它提出了一个问题,最好不要在接口中允许方法实现。

如果您不同意我的第二点,请为此提供解决方案。

顺便提一下,我读过Java documentation,其中说明了:

  

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码具有二进制兼容性。

2 个答案:

答案 0 :(得分:2)

我想说这些是我们在Java 8之前的其他功能

就像你说的那样,它是正确的 - 可以有默认和静态(仅适用于界面,不能覆盖。)

  

从oracle,当您扩展包含默认方法的接口时,您可以执行以下操作

     
      
  1. 根本不提及默认方法,它允许扩展接口继承默认方法。
  2.   
  3. 重新声明默认方法,使其成为抽象。
  4.   
  5. 重新定义默认方法,该方法会覆盖它。
  6.   

所以我不知道该怎么称呼(部分封装与否),它们是默认实现,可以被覆盖。隐藏实际实现仍然是一个功能。

java.utils中的集合使用默认方法来支持lambda表达式。现在有些情况可以提供帮助。

  1. 在很多应用程序中我们需要一个基本实现类,然后我们扩展该类即BaseImplClass implements IsomeInterface因此,您可以选择在您的界面中定义这些默认实现,而不是使用BaseImplClass。如果需要可以覆盖。

  2. 如果你有任何帮助器或实用程序类,你可以在接口...中使用静态方法,这些方法是公共的,最终的,不能被覆盖

  3. 现在如果你想到可能发生的钻石问题(如果一个类使用相同的默认方法签名实现多个接口,我们将会有不明确的情况。答案是否定的,在这种情况下你会在编译时遇到错误。你必须覆盖那个方法。

答案 1 :(得分:0)

答案1:我确信默认方法提供了部分封装。因为当我们将代码包装在一个类(现在可能在内部接口中)时,封装就在那里。它主要是一种抽象的现代方法,我们可以提供我们想要做的而不是我们想要做的事情。

答案2:这不是一个新问题,新手可能会比这更危险。我认为我们可以设置检查风格,不允许这样的方法。