0

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

作者提供的方式是重写该方法,并为开发者在 GWT 日志中添加异常。例子:

public HandlerRegistration addClickHandler(ClickHandler handler){ 
    GWT.log("", new Exception("Cannot add ClickHandler to ReportSizeLabel"));                      
    return null;                                                  
}

我为什么要这样做,这是一个好的设计吗?

如果你必须做这样的事情,为什么不只返回一个 null 呢?

可能是我想太多了,谢谢。

4

2 回答 2

3

我认为这基本上是不好的。返回 null 对程序员没有帮助(最好是抛出异常),并且整个事情打破了多态性的想法。

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

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

于 2012-07-10T19:36:10.330 回答
-1

我看不出这有什么本质上的错误。如果来自父母的功能对孩子来说没有逻辑意义,那么禁用它似乎是一件合理的事情。记录错误可以让您知道它发生了。

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

当然,如果您发现自己禁用了父类或接口的许多功能,那么在某些时候您必须询问您是否真的实现了这个接口,或者只是实现了一些恰好类似于这个接口的其他接口。但是,如果接口声明了 100 个函数并且您禁用了其中的 2 个,我认为为子集定义一个新接口是一个坏主意:这意味着现在必须维护这 98 个函数中的每一个函数的两个定义。如果它不是接口而是父类,那就更糟了。这意味着现在将有 98 个函数的两个副本。重复代码比禁用功能更糟糕。

于 2012-07-10T19:55:28.257 回答