J. Bloch在为Java 6编写的有效Java中提到了以下内容(项目17):
如果您认为必须允许从这样一个类继承,一种合理的方法是确保该类永远不会调用其任何可重写的方法,并记录这一事实。换句话说,完全消除了类对可重写方法的自我使用。
项目18:
如果您使用抽象类来定义类型,那么您将使希望添加功能的程序员别无选择,只能使用继承。与包装器类相比,生成的类功能更弱、更脆弱。 虽然不允许接口包含方法实现,但使用接口定义类型并不妨碍您向程序员提供实现帮助。
现在,在Java 8及其默认方法的实现(使用接口中的其他方法)中,接口对继承是危险的。
例如:
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的说法,当我们尝试实现接口时,它可能会带来一些问题,因为:
在Java 8中做什么呢?有效Java的规则是否仍然适用?
此外,我们不能将默认方法声明为final (就像我们可以为类所做的那样,它将使自用不会对过载者太危险)。
发布于 2015-06-29 09:01:13
好的,从your previous question那里得到答案,看看我们可以在这里应用什么:
你可以简单地避免自我使用。
在这种情况下,您不能这样做。在实现该接口时,您唯一要依赖的选择(如果您想提供默认实现)是方法compute。您必须使用它,或者根本不给出一个实现。
您可以将其中一个涉及到的方法确定为最终方法,因此它不能被覆盖。
这在接口中也不起作用。
你可以让这堂课期末考试,所以不能再延长了。
这在界面上行不通。
您可以在Javadoc注释中描述类的自用模式(满足让其他人知道的要求)。
这是这里唯一的选择。要么记录它,要么不提供默认实现。因此,是的,它的基本思想仍然适用,但你的选择有点有限。
https://stackoverflow.com/questions/31111018
复制相似问题