首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8中的接口

Java 8中的接口
EN

Stack Overflow用户
提问于 2015-06-29 08:26:32
回答 1查看 634关注 0票数 13

J. Bloch在为Java 6编写的有效Java中提到了以下内容(项目17):

如果您认为必须允许从这样一个类继承,一种合理的方法是确保该类永远不会调用其任何可重写的方法,并记录这一事实。换句话说,完全消除了类对可重写方法的自我使用。

项目18:

如果您使用抽象类来定义类型,那么您将使希望添加功能的程序员别无选择,只能使用继承。与包装器类相比,生成的类功能更弱、更脆弱。 虽然不允许接口包含方法实现,但使用接口定义类型并不妨碍您向程序员提供实现帮助。

现在,在Java 8及其默认方法的实现(使用接口中的其他方法)中,接口对继承是危险的。

例如:

代码语言:javascript
复制
public inteface MyInterface{

   public void compute(Object o);

   public default void computeAll(List<Object> oo){
         for(Object o: oo)
            compute(o);       //self-use
   }
}

因此,根据J.Bloch的说法,当我们尝试实现接口时,它可能会带来一些问题,因为:

  1. 重写这样的方法(类似于J.Bloch提供的方法): 公共类MyInterfaceCounter实现了MyInterface{私有int count = 0;@重写公共空计算(对象o) { count++;}@覆盖公共空computeAll(List oo){ count += oo.size();//Damn!MyInterface.super.computeAll(oo);}
  2. 客户端访问接口的内部,即它们必须知道默认实现。

在Java 8中做什么呢?有效Java的规则是否仍然适用?

此外,我们不能将默认方法声明为final (就像我们可以为类所做的那样,它将使自用不会对过载者太危险)。

EN

回答 1

Stack Overflow用户

发布于 2015-06-29 09:01:13

好的,从your previous question那里得到答案,看看我们可以在这里应用什么:

你可以简单地避免自我使用。

在这种情况下,您不能这样做。在实现该接口时,您唯一要依赖的选择(如果您想提供默认实现)是方法compute。您必须使用它,或者根本不给出一个实现。

您可以将其中一个涉及到的方法确定为最终方法,因此它不能被覆盖。

这在接口中也不起作用。

你可以让这堂课期末考试,所以不能再延长了。

这在界面上行不通。

您可以在Javadoc注释中描述类的自用模式(满足让其他人知道的要求)。

这是这里唯一的选择。要么记录它,要么不提供默认实现。因此,是的,它的基本思想仍然适用,但你的选择有点有限。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31111018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档