JavaRush /Java Blog /Random-TL /Mga Interface - mga marker
dupliaka
Antas
Санкт-Петербург

Mga Interface - mga marker

Nai-publish sa grupo
Ang mga interface ng marker ay isang pattern ng disenyo na may pagsuri sa uri ng run-time na nagbibigay-daan sa iyong mag-ugnay ng isang interface at isang klase. Upang maunawaan kung bakit maaaring kailanganin ito, isaalang-alang ang isang halimbawa ng pagmamarka sa Serializible na klase gamit ang isang marker. Ipagpalagay natin na kailangan nating i-save ang estado ng isang bagay sa memorya, at pagkatapos ay ma-decrypt din ang na-save natin. Pagkatapos, sasabihin mo, maaari naming i-convert ang aming bagay sa isang hanay ng mga bit. Tama. Maaari tayong gumamit ng simpleng paraan ng pagsulat sa isang file gamit ang FileInputStream, ngunit ito ay maginhawa lamang kung kakaunti ang mga bagay, ngunit paano kung marami sa kanila? Mayroong isang kahanga-hangang tool sa serialization para dito. Ang pangunahing panuntunan kapag ginamit mo ito ay ang bagay na ini-serialize ay dapat maglaman ng lahat ng data at hindi sumangguni sa iba pang mga bagay. Tingnan ang iyong klase "Aha, ang mga field ay hindi naka-reference at magandang ilagay ang Serializable marker." At kapag inilagay mo ito, ito ay nangangahulugan na ang mga bagay na iyong minarkahan ay maaaring isulat sa ObjectOutputStream. Ang klase ng ObjectOutputStream ay may writeObject0() na paraan, at naglalaman ito ng mga instanceof checks na nagsusuri kung ang object ay maaaring isulat at kung ang buong serye ng mga tseke ay nabigo, pagkatapos ay isang NotSerializableException exception ang itatapon, at kung hindi, lahat ay maayos na nakasulat sa memorya. Gumawa tayo ng klase ng BigObject, ang mga pagkakataon kung saan ise-serialize natin. package post1; import java.io.Serializable; public class BigObject implements Serializable { private int id; public void setId(final int id){ this.id = id; } public int getId() { return id; } } Ang klase ng BigObject ay minarkahan na bilang Serializable. Mayroon itong isang field ng id at kasamang get/set method. package post1; import post1.BigObject; import java.io.*; public class InterfaceMarker { public static void main(String[] args) throws IOException, ClassNotFoundException { int originalId = 12; BigObject objectOriginal = new BigObject(); objectOriginal.setId(originalId); 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(); if (objectCopy.getId() == originalId) System.out.println( "originalId equals copiedId"); } }

Pagre-record ng isang bagay

Una, gumawa kami ng object ng serializable class na BigObject, pagkatapos ay naghahanda kami ng data buffer para dito - ang lugar kung saan ilalagay namin ang lahat ng bows na ByteArrayOutputStream. Pagkatapos ay ihahanda namin ang nabanggit na ObjectOutputStream at ipapasa ang buffer dito. Isinulat namin ang aming object sa stream at isinara ito.

Pagbasa ng isang bagay

Maghanda tayo ng isang write buffer readBuffer, ipasa ang inputStream, basahin ang readObject(). Ang bagay ay naibalik na ngayon. Salamat sa katotohanan na ang field na `id` ay hindi isang link, nagawa naming markahan ang Serializable na klase, na ganap na naglalaman ng data nito. Sa halip na magdagdag ng mga function ng pagpapatunay sa loob ng aming klase, pinapayagan kami ng mga token na pasimplehin ang proseso ng pagpapatunay ng klase.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION