Спасибо 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)
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);
}
...
}
Мне немного неясно, почему вы захотите хранить около 50 клонов одного и того же объекта, если только они не являются оригинальным трейдером в качестве прототипа (см. Схему) для последующих трейдеров.
Если вы хотите сделать точную копию объекта, вы должны принять во внимание проблему полиморфизма. Если людям, относящимся к подклассам данного класса, разрешено добавлять члены-состояния, то у вас уже достаточно головной боли с такими функциями, как equals и compareTo, что клон - это еще один случай, когда вам требуется специальная обработка.
Я не согласен с этим клоном. всегда зло, иногда это необходимо. Однако в ситуациях с подклассами многие вещи становятся сложными.
Я бы порекомендовал вам прочитать (когда у вас есть возможность) «Эффективную Java» Блоха, которая охватывает многие его темы. Браха» Суть в том, что не стоит позволять другим продлевать ваши уроки, и что если вы это сделаете, вам нужно очень хорошо документировать, что им нужно делать, и надеяться, что они будут следовать вашим инструкциям. Там действительно нет способа обойти это. Вы также можете захотеть сделать своих трейдеров неизменяемыми.
Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие). Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.
Вы также можете захотеть сделать своих трейдеров неизменяемыми.Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие). Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.
Вы также можете захотеть сделать своих трейдеров неизменяемыми.Идите вперед, внедрите Clone нормально и очень четко укажите в заголовке класса, что любой, унаследованный от вашего трейдера и добавляющий членов состояния, должен реализовать методы X (укажите, какие).
Поиск трюков для обхода фактического Клонируемого и все же Клонирования не решит проблему наследования. Здесь нет серебряной пули.
Право Ури, полиморфизм с состоянием открывает большую банку червей.
Я думаю, что подкласс Cloneable и переопределение clone () наверное, самый простой путь. Я считаю, что вы можете сделать возвращаемый тип ковариантным.
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;
}
}
}
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.