Если вам нужно глубоко клонировать объект, лучше всего использовать сериализацию Java. Для этого требуется, чтобы объект реализовал Serializable, но он создаст совершенно новый клонированный объект без общих ссылок на оригинал.
Возможно, ваш основной класс реализует Serializable, поэтому каждый подкласс будет автоматически поддерживать его.
Наконец, это, вероятно, можно обновить, чтобы использовать Piped Streams, а не ByteArrayOutputStream, чтобы использовать меньше памяти и быть быстрее, хотя это будет не заметно, если у вас есть небольшие объекты.
public static<T> T clone(T object) {
try {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bOut);
out.writeObject(object);
out.close();
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(bOut.toByteArray()));
T copy = (T)in.readObject();
in.close();
return copy;
}
catch(Exception e) {
throw new RuntimeException(e);
}
}