JSF实用程序类

时间:2011-05-04 11:55:40

标签: java jsf jsf-2

您如何看待实现JSF 2.0托管bean实用程序方法的最佳方法,例如:

public FacesContext getFacesContext() {
    return FacesContext.getCurrentInstance();
}

public Flash getFlash() {
    return getFacesContext().getExternalContext().getFlash();
}

public void addMessage(String clientId, String message) {
    FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_INFO, message,
    message);
    getFacesContext().addMessage(clientId, facesMessage);        
}

我正在考虑使用静态方法作为抽象类或普通类。

我的理解是,扩展类所产生的对象将消耗更多内存,但大多数(几乎所有)内存都是请求范围,因此只要呈现响应就有资格进行垃圾回收。

我对最好的面向对象设计感兴趣,对服务器征税最少。感谢

2 个答案:

答案 0 :(得分:2)

我认为你不应该太担心JSF 2.0的超类对性能的影响。在我的项目中,我们创建了一个抽象基类,所有作为控制器的“Backing Beans”都会扩展。这些方法与您添加的方法类似,也包含其他方法。就个人而言,我会选择抽象的基类方法,例如称之为GenericBean或GenericPageCode,IS-A关系保持不变。我想一个潜在的缺点是这个抽象基类将成为框架的一部分,它的所有实现都会对它的变化敏感......但是这应该没问题,因为基类中的方法不太可能经常改变并打破具体的实施。

当然,替代方案是在Helper类上持有这些方法或静态方法的单例。这不是我个人的偏好,因为你每次都要导入这个类,每次都要获取它的实例或者在类上调用方法。通过继承获得方法对我来说是优选的。

答案 1 :(得分:2)

  

我的理解是,扩展类产生的对象将消耗更多内存

事实并非如此。只有州消耗更多的内存。这些方法没有/使用额外的状态 - 这正是你可以制作它们static而不用担心线程安全问题的原因。

是的,你看到这确实在两个方面得到了解决:

  1. 将它们放在abstract class中,让您的所有托管bean都可以扩展。

    public class Bean extends BaseBean {
        public void submit() {
            addInfoMessage("Submit successful");
        }
    }
    
  2. 将它们放在最终可以通过import static导入的实用程序类中(不,不要将它与单例混淆,因为单例具有状态,但实用程序类没有)。 / p>

    public class Bean {
        public void submit() {
            Jsf.addInfoMessage("Submit successful");
        }
    }
    
  3. 两者都是可以接受的,主要区别在于抽象类方法通过测试框架可以更好地模拟/测试,可能会发生严格的业务需求。