JavaRush /Блоги Java /Random-TG /Кофе-брейк №124. Намунаи тарҳрезии бинокор. Чӣ тавр Сериа...

Кофе-брейк №124. Намунаи тарҳрезии бинокор. Чӣ тавр Сериализатсия ва Десериализатсия дар Java кор мекунанд

Дар гурӯҳ нашр шудааст

Намунаи тарроҳии бинокор дар Java

Сарчашма: Миёна Дар ин мақола мо мефаҳмем, ки чӣ гуна тарҳрезӣ ва сохтани an objectҳоро барои синф бо истифода аз намунаи тарроҳии Builder . Кофе-брейк №124.  Намунаи тарҳрезии бинокор.  Чӣ тавр Сериализатсия ва Десериализатсия дар Java кор мекунанд - 1

Чаро ба мо намунаи тарроҳии Builder лозим аст?

Намунаи Builder барои сохтани an objectҳо бо истифода аз синфи статикии лонашудаи ҷамъиятӣ тарҳрезӣ шудааст, ки дорои ҳамон майдонҳои додаҳо бо синфи берунӣ мебошад. Намунаи Builder барои ҳалли мушкилоте, ки дар намунаҳои тарроҳии Фабрика ва Абстрактии Фабрика мавҷуданд, вақте ки an objectи синф дорои арзишҳои зиёди майдонҳо ва/ё маълумотҳо мебошад, сохта шудааст. Пеш аз он ки мо ба намунаи Builder гузарем , биёед бубинем, ки бо намунаҳои Фабрика ва Заводи абстрактӣ барои сенарияҳое, ки an object дорои арзишҳои зиёди майдонӣ аст, маҳз кадом мушкилот ба вуҷуд меояд:
  1. Доштани далелҳои аз ҳад зиёд барои гузаштан аз барномаи муштарӣ ба синфи Фабрика метавонад боиси хатогиҳо шавад, зеро аксар вақт навъи аргумент якхела аст ва нигоҳ доштани тартиби далелҳо дар тарафи муштарӣ душвор аст.

  2. Баъзе параметрҳо метавонанд ихтиёрӣ бошанд, аммо дар намунаи Фабрика мо маҷбур мешавем, ки ҳамаи параметрҳоро фиристем ва параметрҳои ихтиёрӣ бояд ҳамчун файлҳои NULL фиристода шаванд .

  3. Агар an object «вазнин» ва бо тарҳи мураккаб бошад, пас ҳамаи ин мушкилот ба синфҳои Фабрика дохил мешаванд, ки аксар вақт ба нофаҳмиҳо оварда мерасонанд.

Масъалаҳои дар боло зикргардидаро метавон ҳал кард, ки an object дорои миқдори зиёди параметрҳо бошад. Барои ин ба шумо лозим аст, ки конструкторро бо параметрҳои зарурӣ таъмин кунед ва сипас усулҳои гуногуни танзимкунандаро барои гузоштани параметрҳои ихтиёрӣ. Дар хотир доред, ки мушкилот бо ин усул дар он аст, ки ҳолати an object номувофиқ боқӣ мемонад , агар ҳамаи атрибутҳо ба таври возеҳ муқаррар карда шаванд.

Намунаи тарроҳии Builder чист?

Намунаи Builder мушкилоти доштани параметрҳои зиёди ихтиёрӣ ва ҳолати номувофиқро тавассути пешниҳоди роҳи сохтани an objectи зина ба зина ҳал мекунад. Ин усулеро истифода мебарад, ки воқеан an objectи ниҳоиро бармегардонад.

Тарзи тарроҳии Builder -ро дар Java чӣ гуна бояд татбиқ кард?

Агар мо қадамҳои зеринро иҷро кунем, мо раванди зина ба зина эҷод кардани an object ва дарёфти онро мегирем:
  1. Синфи ҷойгиршудаи статикиро ҳамчун синфи Builder эҷод кунед ва сипас ҳамаи майдонҳоро аз синфи берунӣ ба синфи Builder нусхабардорӣ кунед . Мо бояд конвенсияи номгузориро риоя кунем, аз ин рӯ, агар номи синф Шахс бошад , синфи Builder бояд PersonBuilder номида шавад .

  2. Синфи Builder бояд як созандаи оммавӣ дошта бошад, ки ҳамаи майдонҳои заруриро ҳамчун параметрҳо дар бар мегиранд.

  3. Синфи Builder бояд усулҳои муқаррар кардани параметрҳои ихтиёриро дошта бошад ва он бояд ҳамон an objectи Builder- ро пас аз гузоштани майдони ихтиёрӣ баргардонад.

  4. Қадами охирин ин таъмин кардани усули build() дар синфи Builder мебошад , ки an objectи барои барномаи муштарӣ лозимиро бармегардонад. Барои ин ба мо лозим аст, ки дар синфи асосӣ як конструктори хусусӣ бо синфи 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();
    }
}
Намунаи Builder : java.lang.StringBuilder ва java.lang.StringBuffer барои сохтани an objectҳо намунаи Builder-ро истифода бурданд .

Чӣ тавр Сериализатсия ва Десериализатсия дар Java кор мекунанд

Манбаъ: Миёна Ман дар моҳи январи соли ҷорӣ пас аз таҷрибаомӯзӣ ба Java гузаштам. Пеш аз ин, ман асосан дар PHP ва каме JavaScript навишта будам. Ман қаблан ҳеҷ гоҳ бо сериализатсия дучор нашуда будам, гарчанде ки сериализатсия воқеан дар PHP вуҷуд дорад. Дуруст аст, ки дар Java он бештар истифода мешавад. Имрӯз ман шуморо бо чӣ гуна кор кардани сериализатсия ва бесериализатсия дар Java ва якчанд роҳҳои истифодаи онҳо шинос мекунам.

Сериализатсия ва сериализатсия чист

Сериализатсия табдил додани an object аз синф ба пайдарпаии byteҳо дар Java Virtual Machine (JVM) барои интиқол ба мошини дигари виртуалии Java мебошад. Агар мошини виртуалии Java an objectро аз byteҳо дубора эҷод кунад, ин раванд бессериализатсия номида мешавад.

Намунаи сериализатсия ва сериализатсия

Сериализатсия

Биёед синферо созем, ки an objectи он силсилавӣ карда мешавад:
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 Serializable-ро амалӣ мекунад , то an objectи он силсиласозӣ/серияизатсия карда шавад. Синфи 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();
}
}
}
Тавре ки шумо медонед, усули асосӣ сериализатсияро оғоз мекунад ва паёми муваффақиятро чоп мекунад, вагарна паёми хатогӣ чоп мешавад. Барои силсилаи an objectҳо мо 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();
}
}
}
Десериализатсия баръакси силсиласозӣ аст. Барои аз нав сохтани an object аз пайдарпаии byteҳо, ObjectInputStream ва усули readObject -ро истифода баред . Аҳамият диҳед, ки барои таъмини дастрасӣ ба майдонҳо дар синфи Person , an object ба намуди додаҳои Person интиқол дода мешавад . Объекти синфе, ки интерфейси сериализатсияро амалӣ намекунад, наметавонад сериализатсия карда шавад. Аз ин рӯ, ҳама синфе, ки ба синфе, ки интерфейси сериализатсияро амалӣ мекунад, истинод мекунад, бояд худи интерфейси сериализатсияро амалӣ кунад, дар акси ҳол истисно партофта мешавад. Сериализатсия аз платформа мустақил аст, яъне ҷараёни byteи сериализатсияшуда метавонад аз ҷониби дигар мошини виртуалии Java бесавод карда шавад. Майдонҳои статикӣ ва муваққатӣ сериализатсия карда намешаванд, аз ин рӯ, агар шумо майдоне дошта бошед, ки онро сериализатсия кардан намехоҳед, онро муваққатӣ ё статикӣ созед. Дар ҳолати майдони статикӣ, он силсилавӣ карда намешавад, зеро майдони статикӣ ба синф тааллуқ дорад, на ба an object. Аз ин сабаб, ҳолати гузариш аз силсилаи майдонҳо пешгирӣ мекунад. Сериализатсия дар Hibernate, JPA ва RMI истифода мешавад. Serialization низ метавонад фармоишгари. Ин силсилаизатсияи фармоишӣ номида мешавад.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION