【问题标题】:JSF utility classJSF 实用程序类
【发布时间】:2011-05-04 11:55:40
【问题描述】:

您认为实现 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);        
}

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

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

我对最好的 OO 设计和对服务器的最低负担感兴趣。谢谢

【问题讨论】:

    标签: java jsf jsf-2


    【解决方案1】:

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

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

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

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

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

      public class Bean {
          public void submit() {
              Jsf.addInfoMessage("Submit successful");
          }
      }
      

    两者都可以接受,主要区别只是抽象类方式更好地被测试框架模拟/测试,可能是严格的业务需求。

    【讨论】:

    • 感谢 BalusC,“只有状态消耗更多内存”这正是我希望从答案中获得的额外内容。尽管我记得在学习 JSF 时在您的网站上看到过 FacesUtil 类,但我在当前项目中使用了抽象类。
    • 不客气。是的,FacesUtil 只是一个基本示例。对于初学者来说更容易:)
    【解决方案2】:

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

    当然,另一种方法是在某个地方使用单例,在 Helper 类中保存这些方法或静态方法。这不是我个人的偏好,因为您每次都必须导入类并获取其实例或每次调用类上的方法。通过继承获得方法对我来说更可取。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-09
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多