java – 为什么要使用空的抽象类而不是接口?

我使用GWT和Place&活动机制.

Place是一个类真的很难过,因为我的自定义位置不能扩展另一个类.

当我查看Place代码时,我看到以下内容:

public abstract class Place {

  /**
   * The null place.
   */
  public static final Place NOWHERE = new Place() {
  };

}

看到这个,Place可以是一个界面.有没有一个很好的理由让GWT团队选择将Place放置为抽象类而不是接口?

并概括:是否有充分的理由创建真正空的抽象类vs接口?

最佳答案
我不能真正说出这个地方(虽然我有一些想法,见下文),但它已经讨论过活动:https://groups.google.com/d/topic/google-web-toolkit-contributors/V8rhZHiXFRk/discussion

至于我们可以进入历史,Place在07T中有一个抽象类(和FWIW,在NOWHERE地方添加了0​​7002;注意这个提交引用了一个Wave -soon从互联网上消失 – 我们可以看到界面放置所以在设计API时,它是某个时间点的接口.

鉴于PlaceHistoryGenerator(当您使用GWH.create()PlaceHistoryMapper时使用)查看位置层次结构,具有抽象类会减少大量边缘情况!
想象一下你的PlaceHistoryMapper引用了PlaceTokenizers< Foo>和PlaceTokenizer< Bar>你有一个类FooBar实现Foo,Bar {},应该使用哪个tokenizer?如果你没有在PlaceHistoryMapper中显式引用FooBar类,那么生成器将不会看到它(或者不会看到它),那么它应该生成哪种代码?请记住,我们都需要确定性,因此生成的代码应该始终相同.使用类,生成器可以通过它们的继承树(从最特定的派生到最不具体)对它们进行排序,并且可以安全地假设其中没有特定继承关系的2个地方是完全不同的,所以它们可以是以任何顺序检查(生成的代码中的instanceof)并仍然提供稳定的结果⇒确定性.

免责声明:我是reported订购问题然后provided the patch,但Place已经是一个类.

转载注明原文:java – 为什么要使用空的抽象类而不是接口? - 代码日志