2016-02-27 56 views
-1
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()单独调用对象时工作。

我在做什么错?

+0

见http://stackoverflow.com/questions/913560/what-is-static – Raedwald

回答

1

你的问题是,你的课堂设计是打破。您当前的代码为每个用户实例创建一个新的userList,这不是您想要的。相反,User类不应该保存UserList,而是另一个类应该处理该类,然后当创建用户时,这个其他类将用户放入列表中。

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

如果您总是希望在创建用户时将用户添加到列表中,那么实现此目的的一种方法是保证通过静态工厂方法创建您的用户。

0

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

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