构造函数未将对象添加到所有对象的列表中

时间:2016-02-27 13:02:43

标签: java list constructor

class Users{    
    private LinkedHashSet<Users> userList=new LinkedHashSet<Users>();
    private String name;
        public Users(String name){
            this.name=name;
            userList.add(this);
        }
        public void iterateList(){
            for (Users user:userList){
                System.out.println(user.getName()); //NO OUTPUT WHEN CALLED
            }
        }
       public int getTotalUserCount(){
            return userList.size(); // OUTPUT IS 0
        }
}

我尝试在创建时将Users的实例添加到userList。出于某种原因,当迭代userList时,我发现没有添加对象。

另外, 但是,访问器方法getName()在单独调用对象时有效。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

你的问题是你的班级设计被打破了。您当前的代码为每个用户实例创建新的userList ,这不是您想要的。相反,User类不应该持有UserList,而是另一个类应该处理它,然后当创建Users时,这个其他类将User放入List中。

另一种选择是使userList成为一个静态字段,但是这会导致其他潜在的问题,因为你将用洗澡水丢弃OOP宝宝。

如果您在创建用户时总是希望用户添加他的列表,那么实现此目的并确保其发生的一种方法是通过静态工厂方法创建用户。

答案 1 :(得分:0)

由于userList是一个实例变量,因此每次都会分配新的。您可以将userList标记为静态变量,以便在类级别可用。

答案 2 :(得分:0)

我认为您想要的是userList静态,以便您的应用中只有一个userList,否则您将为每个用户创建一个新列表。

class Users {
    private static LinkedHashSet<Users> userList=new LinkedHashSet<Users>();

    private String name;

    public Users(String name){
        this.name = name;
        userList.add(this);
    }

    public static void iterateList(){
        for (Users user : userList){
            System.out.println(user.getName());
        }
    }

    public static int getTotalUserCount(){
        return userList.size();
    }

    public String getName() {
        return name;
    }
}

然后你可以这样使用它:

public class Main {
    public static void main(String[] args){
        Users user1 = new Users("a");
        Users user2 = new Users("b");

        Users.iterateList();
        System.out.println(Users.getTotalUserCount());
    }
}