骨架实现与普通抽象类有何不同?

时间:2012-06-24 21:52:32

标签: java class interface abstract

Effective Java 中,Joshua Bloch更喜欢接口而不是抽象类。但是,他指出每个接口都应该有一个骨架实现。

我觉得骨架实现几乎与抽象类相同。这两个概念有何不同?

5 个答案:

答案 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,那么它仍然可以使用一个接口。抽象类不提供此功能,因为您只能扩展一个类。

BTW,这是在集合框架(Josh Bloch创建的)中完成的:Set接口由AbstractSet实现,List接口由{{1}实现等等。

答案 2 :(得分:2)

接口/抽象类是API的一部分。

骨架实现是一个有效的具体class,但实施有限/天真/差;对于(一个非常人为的)示例,Sorter接口的骨干实现可能会实现bubble sort - 您不希望在生产应用程序中使用它,但它说明了如何实现接口< / p>

答案 3 :(得分:2)

  

我觉得骨架实现几乎和a一样   抽象类。这两个概念有何不同?

对我来说,他们在意图方面有所不同。当我看到一些方法需要传入接口时,我知道实现取决于我。如果退回课程,我不再确定。对于使用类不存在的接口,只有含义

此外,当我们要传入的类已经是子类时,接受参数类的方法会引发冲突; Java不支持多重继承。接口没有这个问题。

答案 4 :(得分:0)

“骨架实现”是一个具体的类:您可以编译并测试它。

抽象类不是,你不能;)