2015-10-07 81 views
0

我在一个JSF项目中工作,我正在尝试使ArrayList中有一个数组。但我不明白为什么它不起作用。ArrayList中我有一个数组

我有一个错误在这一部分 -

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(); 
     } 

    } 

} 

你有什么想法?

+2

你会得到什么错误? – Mureinik

+1

无法对非静态字段权限进行静态引用 –

+0

而不是“私有静态最终”字符串数组,这可能是“枚举”的一种情况。 – Holloway

回答

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])))); 
0

在Java中,static方法可以访问static数据成员,但不是非静态副本。这是因为范围static方法和字段绑定到,而不是对象的类。另一方面,非静态数据成员和方法的范围是该类的实例。

首先,类通过ClassLoader加载到jvm中。然后实例化类的一个对象。此订单不能更改。
在你的情况,

private String[] rights= { "Administration", "Consultation", "Modification" };

代码块的实例化userDataBean类,而不是之前执行。在另一方面,

private static final ArrayList<User> userList

是尽快类userDataBean类加载器加载实例。

按照上述设计语义,这是一个错误,因为rights成员变量未被实例化,而是在类加载时从静态上下文访问。

声明rights为静态将解决该问题。

private static String[] rights= { "Administration", "Consultation", 
     "Modification" }; 
相关问题