Как использовать Copy Constructor? - PullRequest
0 голосов
/ 05 мая 2019

Я делаю мини твиттер.

Один из методов - это конструктор псевдокопирования, и я не совсем понимаю, как это сделать.

Метод принимает существующего пользователя, нового 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;

        }
}

EDIT

Мне также нужно вернуть мелкую (НЕ справочную или глубокую) копию списка пользователей, за которым следует этот пользователь. Я думал использовать .clone, но я не уверен, как это сделать. Это конструктор:

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

1 Ответ

0 голосов
/ 05 мая 2019

Здесь вы делаете мелкую копию, пока флаг имеет значение true.Это не то, что задается в вашем упражнении.
Кроме того, вы должны обработать оба случая:

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 относятся кодни и те же объекты, в то время как список, который содержит их, ссылается на другой объект.Это имеет смысл, поскольку мы не хотим синхронизировать состояние двух списков на протяжении всей жизни объектов.

В 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) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...