JavaRush /Java Blog /Random-TK /Kofe arakesmesi # 124. Gurluşyk dizaýn nusgasy. Java-da s...

Kofe arakesmesi # 124. Gurluşyk dizaýn nusgasy. Java-da serializasiýa we deserializasiýa nähili işleýär

Toparda çap edildi

Java-da gurluşykçy dizaýn nagşy

Çeşme: Orta Bu makalada, “Builder” dizaýn nagşyny ulanyp, synp üçin obýektleri dizaýn etmegi we döretmegi öwreneris . Kofe arakesmesi # 124.  Gurluşyk dizaýn nusgasy.  Java-da serializasiýa we deserializasiýa nähili işleýär - 1

Näme üçin Gurluşyk dizaýn nusgasy gerek?

Gurluşyk nagşy, daşarky synp bilen birmeňzeş maglumat meýdanlaryna eýe bolan, köpçülikleýin statiki synpy ulanyp, obýektler döretmek üçin niýetlenendir. Gurluşyk nusgasy, synp obýektinde köp meýdan bahalary we / ýa-da maglumatlar bar bolsa, Zawod we Abstrakt Zawod dizaýn nagyşlarynda bar bolan meseleleri çözmek üçin döredildi . Gurluşykçy nagşyna geçmezden ozal , bir obýektiň köp meýdan gymmatlyklary bolan ssenariýalar üçin Zawod we Abstrakt Zawod nagyşlary bilen haýsy meseleleriň ýüze çykýandygyny anyk göreliň :
  1. Müşderi programmasyndan Zawod synpyna geçmek üçin gaty köp argumentiň bolmagy ýalňyşlyklara sebäp bolup biler, sebäbi köplenç argumentiň görnüşi birmeňzeş we müşderi tarapynda argumentleriň tertibini saklamak kyn.

  2. Käbir parametrler islege bagly bolup biler, ýöne Zawod görnüşinde ähli parametrleri ibermäge mejbur bolýarys we goşmaça parametrler NULL faýllary hökmünde iberilmeli .

  3. Eger obýekt “agyr” we çylşyrymly dizaýn bilen bolsa, bu kynçylyklaryň hemmesi köplenç bulaşyklyga sebäp bolýan Zawod sapaklarynyň bir bölegine öwrüler.

Obýektiň köp sanly parametrleri bolanda ýokardaky meseleler çözülip bilner. Munuň üçin konstruktory zerur parametrler bilen üpjün etmeli, goşmaça parametrleri kesgitlemek üçin dürli sazlaýjy usullary bermeli. Bu usul bilen baglanyşykly meseläniň, ähli atributlar anyk kesgitlenmedik ýagdaýynda obýektiň ýagdaýynyň gabat gelmejekdigine üns beriň .

Gurluşyk dizaýn nusgasy näme?

Gurluşyk nagşy, obýekti ädimme-ädim gurmagyň ýoluny hödürläp, köp sanly goşmaça parametrleriň we biri-birine gabat gelmeýän ýagdaýlaryň bolmagy meselesini çözýär. Bu, ahyrky obýekti hakykatdanam yzyna gaýtarýan usuly ulanýar.

Java-da Builder dizaýn nusgasyny nädip durmuşa geçirmeli?

Aşakdaky ädimleri ýerine ýetirsek, bir obýekt döretmek we ony almak üçin ädimme-ädim alarys:
  1. “Builder” synpy hökmünde statiki öýjükli synp dörediň we daşarky synpdan “ Builder” synpyna çenli ähli meýdanlary göçüriň . At dakmak konwensiýasyna eýermeli, şonuň üçin synpyň ady Şahsy bolsa , Gurluşyk synpyna PersonBuilder diýilmeli .

  2. Gurluşykçy synpynda parametrler hökmünde ähli zerur meýdanlary bolan köpçülikleýin konstruktor bolmaly.

  3. Gurluşykçy synpynda goşmaça parametrleri kesgitlemegiň usullary bolmaly we islege bagly meýdan kesgitlenenden soň şol bir Gurluşyk obýektini yzyna gaýtarmaly .

  4. Iň soňky ädim , müşderi programmasy üçin zerur obýekti yzyna gaýtaryp berjek “Builder” synpynda gurmak () usulyny üpjün etmekdir . Munuň üçin esasy synpda argument hökmünde Gurluşyk synpy bilen hususy konstruktor bolmaly .

Mysal:

Gurluşygyň dizaýn nusgasyna takyk düşünmek üçin bir meselä seredeliň .
public class Employee {

    private String name;
    private String company;
    private boolean hasCar;//optional
    private boolean hasBike;//optional

    private Employee(EmployeeBuilder employeeBuilder) {
        name = employeeBuilder.name;
        company = employeeBuilder.company;
        hasCar = employeeBuilder.hasCar;
        hasBike = employeeBuilder.hasBike;
    }

    public String getName() {
        return name;
    }

    public String getCompany() {
        return company;
    }

    public boolean isHasCar() {
        return hasCar;
    }

    public boolean isHasBike() {
        return hasBike;
    }

    public static class EmployeeBuilder {
        private String name;
        private String company;
        private boolean hasCar;//optional
        private boolean hasBike;//optional

        //constructor for required fields
        public EmployeeBuilder(String name, String company) {
            this.name = name;
            this.company = company;
        }

        //setter methods for optional fields
        public EmployeeBuilder setHasCar(boolean hasCar) {
            this.hasCar = hasCar;
            return this;
        }

        public EmployeeBuilder setHasBike(boolean hasBike) {
            this.hasBike = hasBike;
            return this;
        }

        //Build the Employee object
        public Employee build() {
            return new Employee(this);
        }
    }
}

class TestBuilder {
    public static void main(String[] args) {
        //Building the object of Employee thru the build() method provided in EmployeeBuilder class.
        Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
    }
}
Mysal üçin gurluşykçy nagşy : java.lang.StringBuilder we java.lang.StringBuffer obýekt gurmak üçin Builder nagşyny ulandy .

Java-da serializasiýa we deserializasiýa nähili işleýär

Çeşme: Orta , şu ýylyň ýanwar aýynda tejribe geçenden soň Java-a geçdim. Ondan öň köplenç PHP we azajyk JavaScript ýazýardym. PHP-de serializasiýa bar bolsa-da, öň serializasiýa duş gelmedim. Dogry, Java-da has ýygy ulanylýar. Bu gün size Java-da seriallaşdyrmagyň we deserializasiýa etmegiň nähili işleýändigi we olary ulanmagyň birnäçe usuly bilen tanyşdyraryn.

Seriýalaşdyrmak we deserializasiýa näme

Seriallaşdyrma, bir obýektiň synpdan başga bir Java wirtual maşyna geçirmek üçin Java wirtual maşynda (JVM) baýt yzygiderliligine öwrülmegidir. “Java Wirtual Machine” bir zady baýtdan döredýän bolsa, bu prosese deserializasiýa diýilýär.

Serializasiýa we deserializasiýa mysaly

Serializasiýa

Obýekti seriallaşdyryljak synp döredeliň:
import java.io.*;

public class Person implements Serializable{

int id = 0;
String name = "empty";

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Şahsy synp, obýektiniň seriallaşdyrylmagy / deserializasiýa edilmegi üçin Serializable-y amala aşyrýar . Şahsy synpyň iki ugry bar: kesgitleýji we at, synpyň mysaly döredilende deslapky bahadan üýtgeýär. Programmada ulanylýan Serializable interfeýsi we beýleki synplar Java.io bukjasyna getirildi .
public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));

try {

out.writeObject(person);
System.out.println("Success");
} catch(Exception e) {

System.out.println("Unsuccessful");
} finally {

if(out != null) {

out.close();
}
}
}
Bilşiňiz ýaly esasy usul seriallaşdyrmaga başlaýar we üstünlik habaryny çap edýär, ýogsam säwlik habary çap edilýär. Obýektleri seriallaşdyrmak üçin ObjectOutputStream we writeObject usulyny ulanýarys .

Deserializasiýa

public static void main(String[] args) throws FileNotFoundException, IOException {

String filename = "filename here";
Person person = new Person(1, "John");

// Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));

try {

Person personObj = (Person)in.readObject();
System.out.println("Person Id is " +personObj.id + " while name is " + personObj.name);
} catch (Exception e) {

e.printStackTrace();
} finally {

if(in != null) {

in.close();
}
}
}
Deserializasiýa seriallaşdyrmagyň tersidir. Obýektiň yzygiderliliginden bir obýekti täzeden gurmak üçin ObjectInputStream we readObject usulyny ulanyň . Şahsy synpdaky meýdanlara girişi üpjün etmek üçin obýektiň şahsyýet maglumat görnüşine berilýändigini ýadyňyzdan çykarmaň . Seriýalaşdyrma interfeýsini amala aşyrmaýan synp obýekti seriallaşdyrylyp bilinmez. Şonuň üçin seriallaşdyrma interfeýsini amala aşyrýan synpa salgylanýan islendik synpyň özi seriallaşdyrma interfeýsini durmuşa geçirmeli, ýogsam kadadan çykma bolar. Seriallaşdyrma platforma garaşsyz, seriýallaşdyrylan baýt akymynyň başga bir Java Wirtual Machine tarapyndan deserializasiýa edilip bilinjekdigini aňladýar. Statik we wagtlaýyn meýdanlar yzygiderli bolup bilmeýär, şonuň üçin seriallaşdyrmak islemeýän meýdanyňyz bar bolsa, ony wagtlaýyn ýa-da statik ediň. Statik meýdan bar bolsa, seriýalaşdyrylmaýar, sebäbi statiki meýdan bir obýekte däl-de, bir klasa degişlidir. Şol sebäpli geçiş ýagdaýy meýdanyň seriallaşdyrylmagynyň öňüni alýar. Seriallaşdyrma Gibernate, JPA we RMI-de ulanylýar. Serializasiýa hem düzülip bilner. Bu adaty serializasiýa diýilýär.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION