Interfețe de marcare și copii adânci - 1

"Bună, Amigo!"

— Bună, Bilaabo!

„Astăzi vă voi vorbi despre interfețele de marcare ”.

"Interfețele Marker sunt interfețe fără metode. Când o clasă implementează o astfel de interfață, spunem că este marcată de ea."

„Exemple de aceste interfețe includ: clonabil, serializabil, la distanță .”

„ Interfața Serializable este folosită pentru a marca clasele care acceptă serializarea, indicând faptul că instanțe ale acestor clase pot fi serializate și deserializate automat.”

„ Interfața Remote este folosită pentru a identifica obiectele care acceptă execuția de la distanță, adică metode care pot fi invocate de la o altă mașină virtuală Java și/sau un alt computer.”

„ Interfața Cloneable este folosită pentru a marca clasele care acceptă clonarea.”

„O, despre clonare sau copiere”.

„Există două tipuri de copiere: superficială și profundă”.

Copiarea superficială înseamnă crearea unei copii a unui obiect, fără a face duplicate ale vreunuia dintre obiectele la care face referire.”

Copiarea profundă implică duplicarea unui obiect, inclusiv a obiectelor la care face referire și a obiectelor la care fac referire acele obiecte etc.”

„Există o modalitate foarte bună de a crea în mod fiabil o clonă profundă.”

„Această metodă funcționează chiar dacă dezvoltatorii au uitat să marcheze o clasă ca fiind clonabilă. „Singura cerință este ca obiectele să fie serializabile”.

"Iată cum o faci:"

1) Creați un buffer (matrice de octeți) în memorie.

2) Serializați obiectul și subobiectele în buffer.

3) Deserializați ierarhia obiectelor salvate în buffer.

Cod
BigObject objectOriginal = new BigObject();

ByteArrayOutputStream writeBuffer = new ByteArrayOutputStream();
ObjectOutputStream outputStream = new ObjectOutputStream(writeBuffer);
outputStream.writeObject(objectOriginal);
outputStream.close();

byte[] buffer = writeBuffer.toByteArray();
ByteArrayInputStream readBuffer = new ByteArrayInputStream(buffer);
ObjectInputStream inputStream = new ObjectInputStream(readBuffer);
BigObject objectCopy = (BigObject)inputStream.readObject();

„În prima linie, creăm objectOriginal , pe care îl vom clona. Obiectul și toate subobiectele sale trebuie să accepte serializarea.”

„În a treia linie, creăm un ByteArrayOutputStream , care se va extinde dinamic pe măsură ce se adaugă date noi (cum ar fi un ArrayList).”

„În linia 4, creăm un ObjectOutputStream , care este folosit pentru serializare.”

„În linia 5, serializăm objectOriginal într-o matrice de octeți folosind outputStream și îl salvăm în writeBuffer ”.

„În linia 8, convertim writeBuffer într-o matrice obișnuită de octeți. Mai târziu vom „citi” noul nostru obiect din această matrice.”

„În linia 9, transformăm bufferul într-un ByteArrayInputStream pentru a citi din el ca un InputStream.”

„În linia 10, transmitem readBuffer constructorului ObjectInputStream pentru a citi (deserializa) obiectul.”

„În rândul 11, citim obiectul nostru și îl convertim într-un BigObject ”.

"Ce crezi?"

"E frumos."

„Și apropo, când codul este evidențiat în culori diferite, este mult mai ușor de înțeles”.