Там какие-либо альтернативы к реализации Клона в Java?

Спасибо Martin R за ваш комментарий, он привел меня к решению, которое сработало для меня. Я закончил с этим решением. Это не совсем то, что я хотел, но, зная, что в массиве ids редко будет больше 10 записей, он будет делать это сейчас, так как по крайней мере решает проблему с памятью. Надеемся, что Swift и Core Data обеспечат лучшее решение в будущем.

var predicates = [NSPredicate]()

for id in idList
{
     predicates.append(NSPredicate(format: "temporaryId LIKE[c] %@", id))
}

fetchRequest.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
6
задан Cory Walker 27 April 2009 в 00:24
поделиться

5 ответов

Just add an abstract copy method. You can use covariant return types so that the derived type is specified to return a derived instance, which may or may not be important.

public interface Trader {
    Trader copyTrader();
    ...
}


public final class MyTrader implements Trader {
    MyTrader copyTrader() {
        return new MyTrader(this);
    }
    ...
}

Sometimes you might want to generically deal with a collection of derived type of Trader that needs to clone and then return the a properly typed collection. For that you can use generics in an idiomatic way:

public interface Trader<THIS extends Trader> {
    THIS copyTrader();
    ...
}


public final class MyTrader implements Trader<MyTrader> {
    public MyTrader copyTrader() {
        return new MyTrader(this);
    }
    ...
}
2
ответ дан 17 December 2019 в 20:34
поделиться

Мне немного неясно, почему вы захотите хранить около 50 клонов одного и того же объекта, если только они не являются оригинальным трейдером в качестве прототипа (см. Схему) для последующих трейдеров.

Если вы хотите сделать точную копию объекта, вы должны принять во внимание проблему полиморфизма. Если людям, относящимся к подклассам данного класса, разрешено добавлять члены-состояния, то у вас уже достаточно головной боли с такими функциями, как equals и compareTo, что клон - это еще один случай, когда вам требуется специальная обработка.

Я не согласен с этим клоном. всегда зло, иногда это необходимо. Однако в ситуациях с подклассами многие вещи становятся сложными.

Я бы порекомендовал вам прочитать (когда у вас есть возможность) «Эффективную Java» Блоха, которая охватывает многие его темы. Браха» Суть в том, что не стоит позволять другим продлевать ваши уроки, и что если вы это сделаете, вам нужно очень хорошо документировать, что им нужно делать, и надеяться, что они будут следовать вашим инструкциям. Там действительно нет способа обойти это. Вы также можете захотеть сделать своих трейдеров неизменяемыми.

Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие). Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.

Вы также можете захотеть сделать своих трейдеров неизменяемыми.

Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие). Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.

Вы также можете захотеть сделать своих трейдеров неизменяемыми.

Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие).

Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.

2
ответ дан 17 December 2019 в 20:34
поделиться

Право Ури, полиморфизм с состоянием открывает большую банку червей.

Я думаю, что подкласс Cloneable и переопределение clone () наверное, самый простой путь. Я считаю, что вы можете сделать возвращаемый тип ковариантным.

0
ответ дан 17 December 2019 в 20:34
поделиться

One option: If you can make the objects serializable, you can serialize then deserialize it to make a copy, similar to what happens when passing an object over RMI.

Quick copy method:

public MyObject copy() {
    ObjectOutputStream oos = null;
    ObjectInputStream ois = null;
    try {
        ByteArrayOutputStream bos =  new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        oos.writeObject(this);
        oos.flush();
        ByteArrayInputStream bin =
            new ByteArrayInputStream(bos.toByteArray());
        ois = new ObjectInputStream(bin);
        return (MyObject)ois.readObject();
    } catch(Exception e) {
        return null;
    } finally {
        try {
            oos.close();
            ois.close();
        } catch (Exception e) {
            return null;
        }
    }
}
0
ответ дан 17 December 2019 в 20:34
поделиться

One way is to make it a final class like Java's own String, which will make any change to an object of class Trader to create a new copy in memory, but it will make it impossible to subclass it.

Another (better) way is to use a factory method to create and copy Trader objexts, which implies that you must not allow for the default constructor to be used i.e. make it a private. This way you can control the number of instances the class has. See http://en.wikipedia.org/wiki/Factory_method

public class Trader {

    /* prevent constructor so new cant be used outside the factory method */
    private Trader() {
    }

    /* the factory method */
    public static Trader createTrader(int whatKindOfTrader) {

        switch (whatKindOfTrader) {
        case 0:
            return new Trader1(); // extends Trader
        case 1:
        default:
            return new Trader2(); // extends Trader
        }
        return new Trader3(); // or throw exception
    }
}

You might even specify another overloaded method, or a second argument that takes one Trader and copies it into a new one, thus replacing clone. Btw, you might want to override the clone() method and throw CloneNotSupportedException, to prevent default Object cloning.

-2
ответ дан 17 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: