我正在为我的课堂项目制作一个微型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();
}
答案 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) { ... }