"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.
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”.
GO TO FULL VERSION