我有一个Array的ArrayList

时间:2015-10-07 08:53:24

标签: java

我正在一个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();
        }

    }

}

你有什么想法吗?

2 个答案:

答案 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

只要 ClassLoader 加载了类userDataBean

就会被实例化。

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

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

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