如何使用复制构造函数?

时间:2019-05-05 18:17:04

标签: java copy

我正在为我的课堂项目制作一个微型Twitter。

其中一个方法是伪副本构造函数,我很困惑如何进行此操作。

该方法采用一个现有用户,一个新的userID和一个布尔标志。

它应该使用给定的newID创建一个新用户,并与传递的旧用户相同的推文。

有关老用户关注的关注者数量或用户列表的信息,不应复制。

如果标志为false,则对旧用户的推文ArrayList进行浅拷贝,否则对文件进行深拷贝。切勿制作参考副本。

所有其他实例变量应适当初始化。可以帮助您在此处调用早期的构造函数。

这些是我的实例变量和复制构造函数方法:

public class TwitterUser {
    private String userID2;
    private ArrayList<Tweet> listTweets;
    private ArrayList<TwitterUser> toFollow;
    private long numberFollowers;
    private int numTweets;
    private int numberFollowing;

public TwitterUser(TwitterUser old, String newID, boolean flag) {

}

我正在考虑这样做,但是不确定我是否在正确的轨道上:

public TwitterUser(TwitterUser old, String newID, boolean flag) {
        if (flag == true) {
            userID2 = newID;
            listTweets = old.listTweets;
            toFollow = old.toFollow;

        }
}

编辑

我还需要返回该用户关注的用户列表的浅表(非引用或深表)副本。我当时想使用.clone,但不确定如何使用。这是构造函数:

    public ArrayList<TwitterUser> getFollowing() {
        return toFollow.clone();
    }

1 个答案:

答案 0 :(得分:0)

在此标志为真时,您在此处进行浅表复制。那不是练习中要的内容。
此外,您应该处理两种情况:

public TwitterUser(TwitterUser old, String newID, boolean isDistinctListTweets) {
        // common processing
        userID2 = newID;
        if (!isDistinctListTweets) { 
            // shallow copy of the tweets
            listTweets = new ArrayList<>(old.listTweets);  
        }
        else{
            // deep copy of the tweets
            listTweets = new ArrayList<>(old.listTweets.size());  
            for (Tweet tweet : old.listTweets) {
               // add a copy constructor in Tweet too     
               listTweets.add(new Tweet(tweet)); 
            }
        } 
}

请注意,在浅表副本中,两个TwitterUser对象的tweet引用相同的对象,而包含它们的列表引用的是不同的对象。这是有道理的,因为我们不想在对象的整个生命周期中同步两个列表状态。

使用Java 8,您可以通过以下方式简化else语句:

else{
    // deep copy of the tweets
    listTweets = old.listTweets
                    .stream() 
                    .map(Tweet::new)
                    .collect(toList());
} 

除了您的执行之外,我还将使用两种工厂方法对需求进行建模,以使API更清晰:

public static TwitterUser copyWithDistinctTweets(TwitterUser old, String newID) { ... }

public static TwitterUser copyShallow(TwitterUser old, String newID) { ... }