Не существует стандартного способа иметь реализацию любой Коллекции, которая автоматически клонирует свои объекты по мере их добавления.
Если вы действительно хотите, вы можете создать свою собственную реализацию List и использовать отражение , чтобы клонировать каждый входящий и выходящий объект. Когда задают такой вопрос, я никогда не рекомендую вам создавать свою собственную реализацию чего-либо в библиотеке Коллекций. Я думаю, что единственная причина для создания собственной реализации в этом случае заключается в том, что если у вас есть какая-то другая библиотека, которая принимает список или коллекцию в качестве параметра, и вы действительно не хотите, чтобы значения этой коллекции были видоизменены.
Существует также возможность не сохранять изменяемые данные в списке. Вы всегда можете создать неизменные реализации данных, которые вы хотите сохранить в коллекции. Если возможно, это вариант, с которым я бы пошел. Если вы пойдете по этому пути, вам все равно придется убедиться, что элементы Data являются неизменяемыми или вместо них есть List<ImmutableData>
. Использование List<ImmutableData>
может быть неплохой идеей, но вам, вероятно, придется иметь List<? extends Data>
в большинстве сигнатур методов.
Это может выглядеть так:
interface Data {
String getString();
MutableData toMutable();
}
class MutableData implements Data {
String getString() {...}
void setString(String s) {...}
Data toImmutable() {...}
MutableData clone() {...}
}
class ImmutableData implements Data {...}
Если вы по-прежнему хотите клонировать, но не хотите использовать рефлексию или решать все проблемы, связанные с интерфейсом Cloneable, вы можете создать собственный более общий интерфейс для целей вашего приложения.