2016-02-27 90 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()); 
    } 
}