7

这更像是一个概念问题。

我必须处理必须创建动态h:dataTable. 每当我创建一个组件时,我都会做类似的事情:

DataTable table = (DataTable) FacesContext.getCurrentInstance().getApplication()
                      .createComponent(DataTable.COMPONENT_TYPE);

使用FacesContext为我创造一切。

但是我可以简单地做到这一点:

DataTable table = new DataTable();

我之所以采用第一种方式,是因为我在开发时阅读的所有教程和材料都是这样做的,但我从来没有得到明确的答案。

第一个比第二个更好有实际原因吗?

4

1 回答 1

8

Application#createComponent()添加了一个额外的抽象层,允许运行时多态性和可插拔性。具体的实现可以通过<component>条目来配置,而条目faces-config.xml又可以通过 JAR 提供。这允许在不重写/重新编译代码的情况下更改实现。

它与 JDBC API 的工作方式完全一样:您不这样做new SomeDriver(),但您这样做Class.forName(someDriverClassName)允许驱动程序不是编译时依赖项,因此您的 JDBC 代码可以在许多 DB 供应商之间移植,而无需重写/重新编译。

但是,如果应用程序仅用于“内部使用”而不是可分发的(因此所有代码始终在您的控制之下),那么运行时多态性就没有那么大的优势,并且可能会增加(非常小的)开销。

也可以看看:

于 2013-05-17T14:01:01.073 回答