JavaRush /Java блогы /Random-KK /Кофе-брейк №124. Құрылысшы дизайн үлгісі. Java тілінде се...

Кофе-брейк №124. Құрылысшы дизайн үлгісі. Java тілінде сериялау және сериядан шығару қалай жұмыс істейді

Топта жарияланған

Java тілінде құрастырушы дизайн үлгісі

Дереккөз: Орташа Бұл мақалада біз Builder дизайн үлгісін пайдаланып, сыныпқа арналған нысандарды қалай жобалау және жасау керектігін үйренеміз . Кофе-брейк №124.  Құрылысшы дизайн үлгісі.  Java тілінде сериялау және сериядан шығару қалай жұмыс істейді - 1

Неліктен бізге Builder дизайн үлгісі қажет?

Құрастырушы үлгісі сыртқы класс сияқты деректер өрістері бар кірістірілген жалпыға ортақ статикалық сыныпты пайдаланып нысандарды жасауға арналған. Құрастырушы үлгісі сынып нысанында көптеген өріс мәндері және/немесе деректер болған кезде зауыттық және дерексіз зауыттық дизайн үлгілерінде болған мәселелерді шешу үшін жасалған . Құрастырушы үлгісіне көшпес бұрын , нысанда өріс мәндері көп болатын сценарийлер үшін Зауыттық және дерексіз зауыт үлгілерімен қандай мәселелер туындайтынын қарастырайық :
  1. Клиенттік бағдарламадан Factory класына өту үшін тым көп аргументтердің болуы қателерді тудыруы мүмкін, себебі көп жағдайда аргумент түрі бірдей және клиент тарапынан аргументтердің ретін сақтау қиын.

  2. Кейбір параметрлер міндетті емес болуы мүмкін, бірақ Зауыттық үлгіде біз барлық параметрлерді жіберуге мәжбүрміз және қосымша параметрлер NULL файлдары ретінде жіберілуі керек .

  3. Егер нысан «ауыр» және күрделі дизайн болса, онда бұл қиындықтардың барлығы зауыттық сыныптардың бір бөлігіне айналады, бұл көбінесе шатасуға әкеледі.

Жоғарыда келтірілген есептерді an objectінің параметрлері көп болған кезде шешуге болады. Мұны істеу үшін конструкторды қажетті параметрлермен қамтамасыз ету керек, содан кейін қосымша параметрлерді орнату үшін әртүрлі орнату әдістері. Бұл әдіске қатысты мәселе барлық атрибуттар анық орнатылмайынша нысанның күйі сәйкессіз болып қала беретінін ескеріңіз.

Builder дизайн үлгісі дегеніміз не?

Құрастырушы үлгісі an objectіні кезең-кезеңімен құру жолын қамтамасыз ету арқылы көптеген қосымша параметрлер мен сәйкес келмейтін күйлердің болуы мәселесін шешеді. Бұл түпкілікті нысанды қайтаратын әдісті пайдаланады.

Java-да Builder дизайн үлгісін қалай жүзеге асыруға болады?

Төмендегі қадамдарды орындайтын болсақ, біз an objectіні құрудың және оны алудың қадамдық процесін аламыз:
  1. Builder сыныбы ретінде статикалық кірістірілген сыныпты жасаңыз , содан кейін барлық өрістерді сыртқы сыныптан Builder сыныбына көшіріңіз . Біз атау конвенциясын ұстануымыз керек, сондықтан сынып атауы Person болса , Builder сыныбын PersonBuilder деп атаған жөн .

  2. Builder сыныбында параметр ретінде барлық қажетті өрістері бар жалпы конструктор болуы керек.

  3. Builder сыныбында қосымша параметрлерді орнату әдістері болуы керек және ол қосымша өрісті орнатқаннан кейін сол Builder нысанын қайтаруы керек.

  4. Соңғы қадам клиент бағдарламасына қажет нысанды қайтаратын Builder сыныбында build() әдісін қамтамасыз ету болып табылады. Мұны істеу үшін бізге дәлел ретінде Builder сыныбы бар негізгі сыныпта жеке конструктор болуы керек .

Мысалы:

Builder дизайн үлгісін нақты түсіну үшін мысалды қарастырайық .
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();
    }
}
Құрастырушы үлгісінің мысалы : java.lang.StringBuilder және java.lang.StringBuffer нысандарды құру үшін Құрастырушы үлгісін пайдаланды .

Java тілінде сериялау және сериядан шығару қалай жұмыс істейді

Дереккөз: Орта Мен осы жылдың қаңтар айында тағылымдамадан кейін Java тіліне ауыстым. Бұған дейін мен көбінесе PHP және аздап JavaScript тілінде жаздым. Мен бұрын сериялизацияны кездестірмедім, бірақ сериализация PHP-де бар. Рас, Java тілінде ол әлдеқайда жиі қолданылады. Бүгін мен сіздерді Java-да сериализация және сериядан шығару қалай жұмыс істейтінімен және оларды пайдаланудың бірнеше тәсілдерімен таныстырамын.

Сериализация және сериядан шығару дегеніміз не

Серияландыру - бұл басқа Java виртуалды машинасына жіберу үшін Java виртуалды машинасында (JVM) сыныптан an objectіні byteтар тізбегіне түрлендіру. Java виртуалды машинасы byteтардан нысанды қайта жасаса, процесс сериядан шығару деп аталады.

Серияландыру және сериядан шығару мысалы

Серияландыру

Нысан серияланатын класс жасайық:
import java.io.*;

public class Person implements Serializable{

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

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Person сыныбы оның an objectісі сериялануы/сериялануы мүмкін болуы үшін Serializable іске асырады . Person сыныбында екі өріс бар: идентификатор және атау, олар класс данасы жасалған кезде әдепкі мәннен өзгереді. Бағдарламада пайдаланылған Serializable интерфейсі және басқа сыныптар Java.io бумасына импортталды .
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();
}
}
}
Өздеріңіз білетіндей, негізгі әдіс сериялауды бастайды және сәтті хабарды басып шығарады, әйтпесе қате туралы хабар басып шығарылады. Нысандарды сериялау үшін ObjectOutputStream және writeObject әдісін қолданамыз .

Сериядан шығару

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();
}
}
}
Сериялизация сериядан шығаруға кері. Байттар тізбегінен нысанды қайта құру үшін ObjectInputStream және readObject әдісін пайдаланыңыз . Person класындағы өрістерге қатынасты қамтамасыз ету үшін нысан Person деректер түріне шығарылатынын ескеріңіз . Серияландыру интерфейсін жүзеге асырмайтын сынып нысанын сериялау мүмкін емес. Сондықтан, сериализация интерфейсін жүзеге асыратын сыныпқа сілтеме жасайтын кез келген сынып сериялау интерфейсін өзі жүзеге асыруы керек, әйтпесе ерекше жағдай шығарылады. Серияландыру платформаға тәуелсіз, яғни серияланатын byte ағынын басқа Java виртуалды машинасы сериядан шығаруға болады. Статикалық және өтпелі өрістерді сериялау мүмкін емес, сондықтан серияланғыңыз келмейтін өріс болса, оны уақытша немесе статикалық етіп жасаңыз. Статикалық өріс болған жағдайда, ол серияланбайды, себебі статикалық өріс нысанға емес, сыныпқа жатады. Осыған байланысты өтпелі күй өрістің сериялануына жол бермейді. Серияландыру Hibernate, JPA және RMI жүйелерінде қолданылады. Серияландыруды теңшеуге де болады. Бұл реттелетін сериялау деп аталады.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION