Java 抑制超级类的功能,这是好的设计吗?

Java 抑制超级类的功能,这是好的设计吗?,java,gwt,interface,Java,Gwt,Interface,我在读《动作2中的GWT》一书,作者(在开发人员可以通过扩展另一个自定义小部件来创建自定义小部件的部分)提到了如何停止/抑制超类的某些功能的提示,即实现的接口给出的方法 作者提供的方法是重写该方法,并为开发人员将异常添加到GWT日志中。例如: public HandlerRegistration addClickHandler(ClickHandler handler){ GWT.log("", new Exception("Cannot add ClickHandler to Rep

我在读《动作2中的GWT》一书,作者(在开发人员可以通过扩展另一个自定义小部件来创建自定义小部件的部分)提到了如何停止/抑制超类的某些功能的提示,即实现的接口给出的方法

作者提供的方法是重写该方法,并为开发人员将异常添加到GWT日志中。例如:

public HandlerRegistration addClickHandler(ClickHandler handler){ 
    GWT.log("", new Exception("Cannot add ClickHandler to ReportSizeLabel"));                      
    return null;                                                  
}
我为什么要这么做,这是一个好的设计吗

如果必须执行此操作,为什么不直接返回null呢


也许我想得太多了,无论如何,谢谢你。

我认为这基本上是不好的。返回null对程序员没有帮助(最好抛出一个异常),整个过程打破了多态性的概念

因此,正确的答案是创建一个替代的接口链,以获得您需要的所有功能,但不包括
HasClickHandlers
。然而,实际上,这可能需要很多时间。如果这个函数抛出一个异常而不是返回null,我愿意将它放在内部使用的代码中,但我不会将此代码发布给其他人使用


PS:正确的答案可能是正确地实现该方法——在这种情况下,这并不难。

我看不出这有什么内在的错误。如果父函数对子函数没有逻辑意义,那么禁用它似乎是合理的做法。记录错误可以让您知道它发生了

返回null作为禁用方法是否是一个好主意取决于函数的功能。如果调用方正在检查null返回,然后调用一个紧急中止函数,那么抛出一个异常会更有意义。但是,如果函数“正常”返回某个填充在集合中的对象,那么返回null并让调用方在集合中放置null可能是合理的做法

当然,如果您发现自己禁用了父类或接口中的许多函数,那么在某个时候您必须询问您是真正实现了这个接口,还是仅仅实现了与这个接口相似的其他接口。但是如果接口声明了100个函数,而您禁用了其中的2个,我认为为子集定义一个新接口是个坏主意:这意味着现在必须维护98个函数中的每一个都有两个定义。如果它不是一个接口而是一个父类,那么情况会更糟。这意味着现在将有98个功能的两个副本。重复的代码比处理禁用的函数要糟糕得多