Java 为什么要使用空的抽象类而不是接口?
我使用GWT和地点&活动机制 很遗憾,Place是一个类,因为我的自定义Place无法扩展另一个类 当我查看位置代码时,我看到以下内容:Java 为什么要使用空的抽象类而不是接口?,java,gwt,interface,abstract-class,Java,Gwt,Interface,Abstract Class,我使用GWT和地点&活动机制 很遗憾,Place是一个类,因为我的自定义Place无法扩展另一个类 当我查看位置代码时,我看到以下内容: public abstract class Place { /** * The null place. */ public static final Place NOWHERE = new Place() { }; } 因此,该位置可以是一个接口。GWT团队选择将Place设置为抽象类而不是接口,这有什么好的理由吗 概括地说:是否
public abstract class Place {
/**
* The null place.
*/
public static final Place NOWHERE = new Place() {
};
}
因此,该位置可以是一个接口。GWT团队选择将Place设置为抽象类而不是接口,这有什么好的理由吗
概括地说:是否有充分的理由创建真正空的抽象类与接口?一般来说,我不会定义空的抽象类 然而,当我期望将来有一些成员时,我可能会决定使用抽象类而不是接口 “类”的意思是:这是一个 “接口”是指:该接口支持 对于“地点”,我真的可以通过对课堂的一点直觉偏好看到两者 GWT团队选择将Place设置为抽象类而不是接口,这有什么好的理由吗 我想不出一个。但现实一点,抱怨是不会有任何效果的 概括地说:是否有充分的理由创建真正空的抽象类和接口 假设,您可以这样做,以确保未来预期的需求有一个单一的公共基类。。。或者其他原因 但总的来说这是个坏主意。。。国际海事组织
(当然,这样的事情经常是出于历史原因发生的;例如,
抽象类在过去可能有更多的成员被删除了。)我不能代表GWT团队发言,但这个抽象类的唯一原因似乎是强制定义无处可去
正如您所发现的,以这种方式使用抽象类会迫使您进入一个可能不适合您的业务模型的类层次结构。因此,一般来说,如果抽象类真的是完全空的,那么就没有任何意义了
这个例子特别奇怪,因为接口是一个契约。GWTPlace
没有接口,因此没有合同。他们的javadoc声明:
“表示应用程序中的可书签位置”
我本以为会有一些合同被定义来处理这种情况。可书签位置需要哪些方法?如果这只是一个标记,比如Serializable
,我肯定希望它是一个接口,而不是一个抽象类。我真的不能确定的位置(虽然我有一些想法,请参见下文),但它是针对活动进行讨论的:
就历史而言,Place
在GWT中有一个抽象类(FWIW,无处添加了Place;请注意,这个提交引用了一个浪潮——很快就会从互联网上消失——在那里我们可以看到interface Place
,因此在他们设计API的某个时间点它是一个接口)
鉴于PlaceHistoryGenerator
(当您GWT.create()
aPlaceHistoryMapper
时使用)查看位置层次结构,使用抽象类可以减少大量边缘情况
假设您的PlaceHistoryMapper
引用了PlaceTokenizer
和PlaceTokenizer
,并且您有一个类FooBar实现了Foo,Bar{}
,应该使用哪个标记器?如果在PlaceHistoryMapper
中没有显式引用FooBar
类,那么生成器将看不到它(或者更确切地说是看不到它),那么它应该生成哪种代码?请记住,我们都想要确定性,所以生成的代码应该总是相同的。使用类,生成器可以按照继承树对它们进行排序(从最特定的-最派生的-到最不特定的),并且可以安全地假设没有特定继承关系的类的两个位置是完全不同的,因此可以对它们进行检查(instanceof
在生成的代码中)在任何顺序下,仍能提供稳定的结果⇒ 决定论
免责声明:我是负责排序问题的人,但是Place
已经是一个类。接口也可以有常量,所以无处
常量不会影响它应该是接口还是抽象类的决定。@Christopher:你说得对。我编辑我的帖子。对投反对票的客人:请给我提示,让我改进我的问题,我不明白你为什么投我反对票。@Martijn Courtaux可能是故意破坏或思维定势的盖世太保。这是SOThanks的常见现象,我不是在抱怨,我只是想理解,因为我认为Gwt团队通常选择好的设计,而这一个让我不安。没有人是完美的。别担心。由于历史原因+1。。。当你不了解历史(以及为满足各种要求而做出的权衡)时,很容易批评一个设计。当你说“期待一些成员”时,你的意思是“期待一些对象”吗?@Aditya Naidu不,我是指成员方法或成员字段谢谢你的回答,这是最清楚、最合理的答案。我认为它是有效的。