JSF 实用程序类

Mam*_*dou 5 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);        
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑作为抽象类或具有静态方法的普通类。

我的理解是,扩展类产生的对象将消耗更多内存,但大多数(几乎全部)都是请求范围的,因此一旦呈现响应就可以进行垃圾回收。

我对最好的面向对象设计和对服务器负担最小的设计感兴趣。谢谢

Bal*_*usC 3

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

这不是真的。只有状态消耗更多的内存。这些方法没有/使用额外的状态 - 这正是您可以创建它们static而不用担心线程安全问题的原因。

是的,您会看到这个问题确实通过两种主要方式得到解决:

  1. 将它们放在一个abstract class让所有托管 bean 扩展的地方。

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

    public class Bean {
        public void submit() {
            Jsf.addInfoMessage("Submit successful");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

两者都是可以接受的,主要区别只是抽象类方式更容易通过测试框架进行模拟/测试,可能这是严格的业务需求。