我正在一个JSF项目中工作,我正在尝试创建一个ArrayList,其中我有一个Array。但我无法理解为什么它不起作用。
我在这部分中有错误 -
private static final ArrayList<User> userList = new ArrayList<User>(
Arrays.asList(new User("A1", rights[0]),
(new User("A2", rights[1])),
(new User("A3", rights[1])),
(new User("A4", rights[2])),
(new User("A5", rights[2]))));
我认为我错误地做了这个部分:(new User("A1", rights[0]),
这是我的代码:
@ManagedBean(name = "user")
@SessionScoped
public class userDataBean implements Serializable {
/**
* SERIAL UID
*/
private static final long serialVersionUID = 1L;
/**
* ATTRIBUTS
*/
private String name;
private String[] rights= { "Administration", "Consultation",
"Modification" };
// GETTER AND SETTER
// CONSTRUCTORS
private static final ArrayList<User> userList = new ArrayList<User>(
Arrays.asList(new Utilisateur("A1", rights[0]),
(new Utilisateur("A2", rights[1])),
(new Utilisateur("A3", rights[1])),
(new Utilisateur("A4", rights[2])),
(new Utilisateur("A5", rights[2]))));
public ArrayList<User> getUserList() {
return userList;
}
public String addAction() {
User user = new User(this.name, this.rights);
userList.add(user);
return null;
}
public String deleteAction(User user) {
userList.remove(user);
return null;
}
public class User{
String name;
String[] rights;
// GETTER AND SETTER
public Utilisateur(String user, String[] rights) {
this.name = name;
this.rights = rights;
}
public Utilisateur() {
super();
}
}
}
你有什么想法吗?
答案 0 :(得分:0)
正如错误方法所述,静态上下文无法访问非静态上下文。由于userDataBean.rigthts
基本上是一个常量,只需添加static
修饰符即可。如果你真的想传达它应该被视为常数的观点,你也可以声明它final
private static final String[] RIGHTS = { "Administration", "Consultation",
"Modification" };
private static final ArrayList<User> userList = new ArrayList<User>(
Arrays.asList(new Utilisateur("A1", RIGHTS[0]),
(new Utilisateur("A2", RIGHTS[1])),
(new Utilisateur("A3", RIGHTS[1])),
(new Utilisateur("A4", RIGHTS[2])),
(new Utilisateur("A5", RIGHTS[2]))));
答案 1 :(得分:0)
在Java中,static
方法可以访问static
数据成员,但不能访问非静态对应方。这是因为static
方法和字段的范围绑定到类,而不是类的对象。另一方面,非静态数据成员和方法的范围是该类的实例。
首先,通过 ClassLoader 将类加载到jvm中。然后,实例化该类的对象。此订单无法更改 在你的情况下,
private String[] rights= { "Administration", "Consultation", "Modification" };
codeblock是在实例化userDataBean类时执行的,而不是之前执行的。另一方面,
private static final ArrayList<User> userList
userDataBean
,就会被实例化。
按照上面的设计语义,这是一个错误,因为rights
成员变量没有实例化,而是在类加载时从静态上下文访问。
将rights
声明为静态将解决问题。
private static String[] rights= { "Administration", "Consultation",
"Modification" };