Loading...

Уруксат алуу модификаторлору жана инкапсуляция

 

Java тилиндеги бардык класстын мүчөлөрү - талаалар жана методдор - кирүү өзгөрткүчтөрү бар. Мурунку темаларда биз коомдук өзгөрткүчкө жолукканбыз. Кирүү модификаторлору класстын мүчөлөрү үчүн жарактуу чөйрөнү, башкача айтканда, берилген өзгөрмө же ыкма колдонула турган контекстти коюуга мүмкүндүк берет.

 

Java төмөнкү кирүү өзгөрткүчтөрүн колдонот:

  • коомдук: коомдук, коомдук класс же класс мүчөсү. Коомдук өзгөрткүч менен жарыяланган талаалар жана ыкмалар башка класстарга учурдагы пакеттен жана тышкы пакеттерден көрүнүп турат.

 

  • жеке: жеке класс же класстын мүчөсү, коомдук өзгөрткүчтүн карама-каршы. Жеке класс же класс мүчөсү бир эле класстагы коддон гана жеткиликтүү.

 

  • корголгон: мындай класс же класс мүчөсү учурдагы класстын же топтомдун каалаган жеринен же туунду класстарда, алар башка пакеттерде болсо да жеткиликтүү

 

  • Баштапкы өзгөрткүч. Талаа же класс ыкмасы үчүн модификатордун жоктугу ага демейки өзгөрткүч колдонуларын билдирет. Мындай талаалар же ыкмалар учурдагы пакеттеги бардык класстарга көрүнүп турат.

Мисал катары төмөнкү программаны колдонуу менен кирүү модификаторлорун карап көрөлү:

public class Program{

     

    public static void main(String[] args) {

            

        Person kate = new Person("Kate", 32, "Baker Street", "+12334567");

        kate.displayName();     // норм, метод public

        kate.displayAge();      // норм, метод имеет модификатор по умолчанию

        kate.displayPhone();    // норм, метод protected

        //kate.displayAddress();  // ! Ошибка, метод private

 

        System.out.println(kate.name);      // норм, модификатор по умолчанию

        System.out.println(kate.address);   // норм, модификатор public

        System.out.println(kate.age);       // норм, модификатор protected

        //System.out.println(kate.phone);   // ! Ошибка, модификатор private

    }

}

class Person{

    

    String name;

    protected int age;

    public String address;

    private String phone;

 

    public Person(String name, int age, String address, String phone){

        this.name = name;

        this.age = age;

        this.address = address;

        this.phone = phone;

    }

    public void displayName(){

        System.out.printf("Name: %s \n", name);

    }

    void displayAge(){

        System.out.printf("Age: %d \n", age);

    }

    private void displayAddress(){

        System.out.printf("Address: %s \n", address);

    }

    protected void displayPhone(){

        System.out.printf("Phone: %s \n", phone);

    }

}

Мында эки класс тең бир пакеттедемейки пакетте жайгашкан, ошондуктан Program классында биз Person классынын демейки модификатору бар, ачык жана корголгон бардык ыкмаларын жана өзгөрмөлөрүн колдоно алабыз. Ал эми Программа классындагы жеке өзгөрткүчү бар талаалар жана ыкмалар жеткиликтүү болбойт.

 

Эгерде Программа классы башка пакетте жайгашкан болсо, анда ал үчүн ачык өзгөрткүчү бар талаалар жана методдор гана жеткиликтүү болмок.

 

Кирүү модификатору калган өзгөрмөнүн же методдун аныктамасынын алдында болушу керек.

Инкапсуляция

Эмне үчүн бардык өзгөрмөлөрдү жана ыкмаларды пакетке же класска карабастан программанын каалаган жеринде жеткиликтүү болушу үчүн коомдук өзгөрткүч менен жарыялоого болбосун? Мисалы, куракты чагылдырган жаштык талааны алалы. Эгерде башка класстын бул талаага түздөн-түз кирүү мүмкүнчүлүгү бар болсо, анда программанын жүрүшүндө ага туура эмес маани, мисалы, терс сан берилиши мүмкүн. Мындай маалыматтарды өзгөртүү каалабайт. Же биз кээ бир маалыматтардын түздөн-түз жеткиликтүү болушун каалайбыз, аны консолго басып чыгара алабыз же жөн эле анын маанисин биле алабыз. Ушуга байланыштуу, аны сырттан келген керексиз кирүүдөн коргоо үчүн (маалыматты алуу үчүн да, аны өзгөртүү үчүн да) мүмкүн болушунча аларга кирүү мүмкүнчүлүгүн чектөө сунушталат. Ар кандай модификаторлорду колдонуу маалыматтардын бузулуп же туура эмес өзгөртүлүшүн камсыздайт. Мындай масштабдагы маалыматтарды жашыруу инкапсуляция деп аталат.

 

Ошентип, эреже катары, талааларды түздөн-түз колдонуунун ордуна, кирүү ыкмалары колдонулат. Мисалы:

public class Program{

     

    public static void main(String[] args) {

            

        Person kate = new Person("Kate", 30);

        System.out.println(kate.getAge());      // 30

        kate.setAge(33);   

        System.out.println(kate.getAge());      // 33

        kate.setAge(123450);   

        System.out.println(kate.getAge());      // 33

    }

}

class Person{

    

    private String name;

    private int age = 1;

 

    public Person(String name, int age){

        

        setName(name);

        setAge(age);

    }

    public String getName(){

        return this.name;

    }

    public void setName(String name){

        this.name = name;

    }

    public int getAge(){

        return this.age;

    }

    public void setAge(int age){

        if(age > 0 && age < 110)

            this.age = age;

    }

}

Андан кийин Person классындагы аты жана жаш талаалары менен түздөн-түз иштөөнүн ордуна, биз бул талаалардын маанилерин орнотуп, кайтаруучу ыкмалар менен иштейбиз. SetName, setAge жана ушул сыяктуу ыкмалар талаанын маанилерин өзгөрткөндүктөн, мутаторлор (мутаторлор) деп да аталат. Ал эми getName, getAge жана ушул сыяктуу ыкмалар аксессуарлар (акцессорлор) деп аталат, анткени алардын жардамы менен биз талаанын маанисин алабыз.

 

Мындан тышкары, биз бул ыкмаларга кошумча логиканы жумшай алабыз. Мисалы, бул учурда, жаш өзгөргөндө, жаңы маани уруксат берилген диапазонго туура келер-келбесин текшерүү жүргүзүлөт.