为什么我应该使用createComponent而不是自己创建实例?

Rod*_*aki 7 jsf-2

这更像是一个概念性问题.

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

DataTable table = (DataTable) FacesContext.getCurrentInstance().getApplication()
                      .createComponent(DataTable.COMPONENT_TYPE);
Run Code Online (Sandbox Code Playgroud)

用它FacesContext来为我创造一切.

但是,我可以简单地这样做:

DataTable table = new DataTable();
Run Code Online (Sandbox Code Playgroud)

我在第一种方式中做到这一点的原因是我在开发时阅读的所有教程和材料都是这样做的,但我从来没有得到明确答案的原因.

有没有一个实际的原因,为什么第一个优于第二个?

Bal*_*usC 8

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

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

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

也可以看看: