gpt4 book ai didi

jsf - JSF Managed bean 中 List 的初始化

转载 作者:行者123 更新时间:2023-12-04 00:04:35 25 4
gpt4 key购买 nike

我有一个关于 POJO 中 List 初始化的问题,因为它遵循下一个代码:

public class Person {

//other fields...
private List<String> friends=new ArrayList<>();

public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}

}

或者像这样更好并且在其他类中有初始化(例如Bean(JSF))
public class Person {

//other fields...
private List<String> friends;

public List<String> getFriends() {
return friends;
}
public void setFriends(List<String> friends) {
this.friends = friends;
}

}

所以我的问题是哪种方法更好?

最佳答案

如果它是您所说的托管 bean,您应该在使用 @PostConstruct 注释的方法中执行此操作。

public class Person {
private List<String> friends;
@PostConstruct
public void init(){
friends = new ArrayList<String>();
}

//getter and setter...
}
  • 在 JSF 的上下文中,通常不赞成在 getter 和 setter 中进行任何初始化的做法。见 Why JSF calls getters multiple times
  • 另外,per the API for @PostConstruct ,契约(Contract)规定了安全特性,并保证如果在这样注释的方法中抛出异常,则不应将 bean 投入使用。普通构造函数没有这样的保证。
  • 在托管 bean 中,注入(inject)在构建后立即发生。这意味着您在构造函数中执行的任何操作都不能依赖于任何注入(inject)的资源(通过 @ManagedProperty )。而在 @PostConstruct方法,您将可以访问托管 bean
  • 上声明的所有资源

    编辑:重要的是要注意只能有一个 @PostConstruct对于任何 @ManagedBean ,所以所有重要的初始化都应该在那里发生。

    还值得注意的是,虽然 @PostConstruct方法是初始化支持 bean 变量/ List 的理想位置, 对托管 bean 的范围有影响
  • @RequestScoped :在带有此注解的托管 bean 中,每次提交相关的 JSF View 都会调用该方法。一个 @RequestScoped每个请求都会销毁并重新创建 bean,这意味着根据您的设置,列表在 @PostConstruct 中初始化可以在每次请求期间重置为空值或默认值。在某些情况下,由于重新初始化列表 mid-JSF 请求,可能会发生转换错误。
  • @ViewScoped : 在带有这个注解的托管 bean 中,保证你拥有 @PostConstruct方法运行一次,当且仅当 您正在处理 @ViewScoped 的同一实例 bean 。如果 viewscoped bean 被销毁并重新创建,@PostConstruct方法将再次运行。
  • @SessionScoped : 带有此注解的 bean 被创建一次,并一直保持事件状态,直到用户的 HTTP session 结束。在这种情况下,@PostConstruct方法保证只运行一次,直到 bean 被销毁

  • 也可以看看
  • https://stackoverflow.com/a/3406631/1530938
  • 关于jsf - JSF Managed bean 中 List 的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15773350/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com