Java 如何封装集合?

Java 如何封装集合?,java,Java,问题:如果我希望在调用新的setUsers后,PreviuUsers仍保留旧值,我应该如何修改此程序?尝试: import java.util.ArrayList; import java.util.HashSet; import java.util.Set; public class A { private Set<String> users = new HashSet<String>(); public Set<String> getU

问题:如果我希望在调用新的setUsers后,PreviuUsers仍保留旧值,我应该如何修改此程序?

尝试:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class A
{
    private Set<String> users = new HashSet<String>();

    public Set<String> getUsers()
    {
        return users;
    }

    public void setUsers( Set<String> users )
    {
        this.users.clear();
        if( users != null )
        {
            this.users.addAll( users );
        }
    }

    public static void main( String[] args )
    {
        A a = new A();
        Set<String> temp = new HashSet<String>();
        temp.add( "a1" );
        temp.add( "a2" );
        a.setUsers( temp );
        Set<String> previousUsers = a.getUsers();
        System.out.println( previousUsers.size() ); //output 2

        temp.add( "a3" );
        a.setUsers( temp );
        System.out.println( previousUsers.size() );//output 3, how to make it still 2?
    }
}
如果我想让Previouser在调用新的setUsers后仍保留旧值


这意味着在setUsers中修改的集合不能与以前的用户所指向的集合相同。因此,在getUsers中,返回集合的副本,而不是对同一集合的引用。这就是它的作用。

您可以使用此构造函数,而不仅仅是直接将返回分配给以前的用户。

这是您期望的吗

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class A
{
    private Set<String> users = new HashSet<String>(), prevUsers = new HashSet<String>();    
    public Set<String> getUsers()
    {
        return users;
    }

    public void setUsers( Set<String> users )
    {
        this.prevUsers = new HashSet<String>(users); // saves a copy of users in prevUsers
        this.users.clear();
        if( users != null )
        {
            this.users.addAll( users );
        }
    }
    public Set<String> getPrevUsers() { 
        return this.prevUsers; 

    }
    public static void main( String[] args )
    {
        Set<String> previousUsers = a.getPreviousUsers();
        System.out.println( previousUsers.size() ); //output 2

        temp.add( "a3" );
        a.setUsers( temp );
        System.out.println( a.getPreviousUsers.size() );//output 3, how to make it still 2?
    }
}

这是你的作业吗?如果是,请先自己尝试一下。提示:-不要清除您的设置。只是在末尾追加。接口是setUsers,而不是addUsers,追加可能不起作用。我不认为Set有方法cloneclone是java.lang.Object的方法,所以java中的每个对象都继承它。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class A
{
    private Set<String> users = new HashSet<String>(), prevUsers = new HashSet<String>();    
    public Set<String> getUsers()
    {
        return users;
    }

    public void setUsers( Set<String> users )
    {
        this.prevUsers = new HashSet<String>(users); // saves a copy of users in prevUsers
        this.users.clear();
        if( users != null )
        {
            this.users.addAll( users );
        }
    }
    public Set<String> getPrevUsers() { 
        return this.prevUsers; 

    }
    public static void main( String[] args )
    {
        Set<String> previousUsers = a.getPreviousUsers();
        System.out.println( previousUsers.size() ); //output 2

        temp.add( "a3" );
        a.setUsers( temp );
        System.out.println( a.getPreviousUsers.size() );//output 3, how to make it still 2?
    }
}
 public Set<String> getUsers()
{
    Set<String> users1 =  new HashSet<String>();
    users1.addAll(users);
    return users1;
}

public void setUsers( Set<String> users )
{
    this.users = users;

}