在 Effective Java 中,Joshua Bloch更喜欢接口而不是抽象类。但是,他指出每个接口都应该有一个骨架实现。
我觉得骨架实现几乎与抽象类相同。这两个概念有何不同?
答案 0 :(得分:6)
重新阅读 Effective Java
中的上述部分后编辑According to this section of the book骨架实现 是一个抽象类。他推荐这种方法,因为在实现骨架实现之后,实现接口并有选择地覆盖方法变得微不足道,即使是匿名类(正如他在书中所做的那样)。
上一个答案,略微编辑了连续性
理论上,骨架实现可以是一个完整的实现,因此具体。然后它可以与composition一起使用,因为它可以被实例化。而抽象类需要继承。
答案 1 :(得分:4)
他的意思是你应该提供一个接口,以及一个实现该接口部分的抽象类:
public interface Foo {
void bar();
void baz();
}
private abstract class AbstractFoo implements Foo {
...
}
如果可以提供基本的,完整的实现,AbstractFoo
类甚至可能不是抽象的。但是如果你需要一个Foo类,但不能扩展AbstractFoo,那么它仍然可以使用一个接口。抽象类不提供此功能,因为您只能扩展一个类。
Set
接口由AbstractSet
实现,List
接口由{{1}实现等等。
答案 2 :(得分:2)
接口/抽象类是API的一部分。
骨架实现是一个有效的具体class
,但实施有限/天真/差;对于(一个非常人为的)示例,Sorter
接口的骨干实现可能会实现bubble sort - 您不希望在生产应用程序中使用它,但它说明了如何实现接口< / p>
答案 3 :(得分:2)
我觉得骨架实现几乎和a一样 抽象类。这两个概念有何不同?
对我来说,他们在意图方面有所不同。当我看到一些方法需要传入接口时,我知道实现取决于我。如果退回课程,我不再确定。对于使用类不存在的接口,只有含义。
此外,当我们要传入的类已经是子类时,接受参数类的方法会引发冲突; Java不支持多重继承。接口没有这个问题。
答案 4 :(得分:0)
“骨架实现”是一个具体的类:您可以编译并测试它。
抽象类不是,你不能;)