jak skopiować obiekt

0

Witam, mam trywialny z pozoru problem. Potrzebuje skopiować obiekt. Czy w Javie istnieje jakiś prosty sposób na skopiowanie obiektu, niezależnie od tego, jakiej jest on klasy?

Dostaję na wejściu metody Vector<Object> i nie wiem, co tam może być, a potrzebuję zwrócić wektor z kopiami. Nakombinowałem się co niemiara i nic...

0
project.cpp napisał(a)

Witam, mam trywialny z pozoru problem. Potrzebuje skopiować obiekt. Czy w Javie istnieje jakiś prosty sposób na skopiowanie obiektu, niezależnie od tego, jakiej jest on klasy?

Dostaję na wejściu metody Vector<Object> i nie wiem, co tam może być, a potrzebuję zwrócić wektor z kopiami. Nakombinowałem się co niemiara i nic...

Metoda clone

0

użyj metody clone(), jest to metoda klasy Object.

0

Metoda clone() mimo tego co napisali koledzy nie zawsze zadziała.
Aby mogła działać, to <ort>conajmniej </ort>elementy tablicy muszą implementować interfejs Cloneable. Jego najciekawszą cechą jest to, że jest on pusty (nie zawiera ani jednej metody). :|
Chodzi o to, że wersja metody clone() zaimplementowana przez Object jest chroniona (czyli kompletnie nieużyteczna w sensie użytkowym) i robi jedną jedyną rzecz: Wyrzuca wyjątek, który powoduje wylot programu w kosmos (sic!).
Aby tak się nie działo należy zaimplementować interfejs Cloneable oraz przeciążyć metodę clone() wraz z jednoczesnym upublicznieniem jej.

Jeżeli Vector zawiera obiekty, które nie mają publicznej metody clone(), ani żadnej innej, którą można o takie działanie podejrzewać, to w tej chwili wydaje mi się, że nie ma w Javie sposobu na skopiowanie takiej tablicy wraz z obiektami. Mogą być one przecież wszystkim - nawet kolejnymi tablicami czy całymi drzewami struktur.
Aby móc skopiować Vectora trzeba zapytać czy on i wszystkie jego elementy przechodzą test "instanceof Cloneable". Jeżeli tak, to da się tablicę skopiować. Jeżeli nie, to płacz. ;) Da się jeszcze ominąć brak Cloneable dla Vectora ponieważ jego zawsze możemy stworzyć od zera znając jedynie jego pojemość i ilość elementów (publiczne), ale dla elementów już nie.

Być może w takim ogólnym wypadku mogłaby pomóc refleksja lub przerzucenie adresu Vectora i jego elementów do C++ za pomocą JNI/JNA. Ale tutaj nie mam pewności.

I zapomniałem dopisać. Problem wcale nie jest trywialny. W Javie kopiowanie głębokie implementuje clone(), kopiowania płytkiego właściwie nie ma (chyba, że znowu clone) poza szczególnym przypadkiem Arrays.copyOf(), a nie ma jak określić długości pamięci obiektu bo nie ma czegoś takiego jak sizeof. Metody określające dokładne zużycie pamięci na obiekt są bardzo okrężne, czasochłonne i nie na każdej JVM działające na 100%.

0

NoZi, ricker: metoda clone jest protected() dla klasy Object. A dla klasy Vector działa tak, że kopiuje wektor z referencjami do... oryginałów.

Olamagato: wielkie dzięki za odpowiedź! Jeżeli chodzi o okrężne metody, to tak na chama możnaby obiekt zserializować do pliku i potem odtworzyć dowolną ilość razy. Ale to może też nie zawsze działać.

0
project.cpp napisał(a)

Olamagato: wielkie dzięki za odpowiedź! Jeżeli chodzi o okrężne metody, to tak na chama możnaby obiekt zserializować do pliku i potem odtworzyć dowolną ilość razy. Ale to może też nie zawsze działać.

Wkręty również młotkiem wkręcasz? :>

0

Ten pomysł z serializacją wcale nie jest głupi. Można sprawdzić obie możliwości (klonowanie elementów i ich serializacja). Jeżeli dla którego z rozwiązań wszystkie niezerowe referencje dadzą pozytywny wynik, to cały obiekt da się powielić. Tyle, że wtedy mamy rozrzut wyniku operacji od pełnego powodzenia, aż po pełne niepowodzenie.

0
graf.zero napisał(a)

Wkręty również młotkiem wkręcasz? :>

Jej... Czy na każdym forum muszą być obecne złośliwości??? [!!!]
A jak jesteś taki mądry, to zamiast pisać złośliwych komentarzy, możesz napisać jak rozwiązać ten problem. Na pewno będzie to bardziej porzyteczne niż taki komentarz!!

1 użytkowników online, w tym zalogowanych: 0, gości: 1