JavaRush /Блоги Java /Random-TG /Тағирдиҳандаҳои дастрасӣ. Хусусӣ, муҳофизатшуда, пешфарз,...

Тағирдиҳандаҳои дастрасӣ. Хусусӣ, муҳофизатшуда, пешфарз, ҷамъиятӣ

Дар гурӯҳ нашр шудааст
Салом! Дар лексияи имрӯза мо бо мафҳуми « модификаторҳои дастрасӣ » шинос мешавем ва мисолҳои кор бо онҳоро дида мебароем. Тағирдиҳандаҳои дастрасӣ.  Хусусӣ, муҳофизатшуда, пешфарз, ҷамъиятӣ - 1Ҳарчанд калимаи «биё шинос шавем» комилан дуруст нахоҳад буд: шумо бо аксарияти онҳо аллакай аз лексияҳои қаблӣ шинос ҳастед. Ба ҳар сурат, биёед хотираи худро дар бораи чизи асосӣ тароват кунем. Тағирдиҳандаҳои дастрасӣ аксар вақт калимаҳои калидӣ мебошанд, ки сатҳи дастрасӣ ба қисмҳои гуногуни codeи шуморо танзим мекунанд. Чаро "аксаран"? Зеро яке аз онҳо бо нобаёнӣ муқаррар карда мешавад ва бо калимаи калидӣ нишон дода намешавад :) Дар Java ҳамагӣ чор тағирдиҳандаи дастрасӣ мавҷуданд. Мо онҳоро ба тартиб аз сахттарин то "нарм" номбар мекунем:
  • хусусӣ;
  • ҳифзшуда;
  • пешфарз (бастаи намоён);
  • оммавй
Биёед ба ҳар яки онҳо назар андозем, қарор диҳем, ки кай онҳо метавонанд барои мо муфид бошанд ва мисолҳо орем :)

Тағйирдиҳандаи хусусӣ

Тағирдиҳандаҳои дастрасӣ.  Хусусӣ, муҳофизатшуда, пешфарз, ҷамъиятӣ - 2Private— тағирдиҳандаи дастрасии маҳдудкунанда. Он намуди зоҳирии маълумот ва усулҳоро дар дохor як синф маҳдуд мекунад. Шумо ин тағирдиҳандаро аз лексия дар бораи гирандагон ва сетерҳо медонед. Ин мисолро дар хотир доред?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
Мо онро дар яке аз мақолаҳои қаблӣ дида будем. Дар ин ҷо мо ба хатои ҷиддӣ роҳ додем: мо маълумоти худро кушодем, ки дар натиҷа барномасозони ҳамимонон ба майдонҳои синф дастрасии мустақим доштанд ва арзишҳои онҳоро тағир доданд. Гузашта аз ин, ин арзишҳо бидуни санҷиш таъин карда шуданд, ки дар натиҷа дар барномаи мо метавон як гурбаеро бо синну соли -1000 сол, номи "" ва вазни 0 эҷод кард. Барои ҳалли ин мушкилот, мо гетерҳо ва танзимкунандагонро истифода мебаранд ва инчунин дастрасии маҳдуд ба маълумот бо истифода аз тағирдиҳанда private.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // checking the input parameter
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // checking the input parameter
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // checking the input parameter
       this.weight = weight;
   }
}
Воқеан, маҳдуд кардани дастрасӣ ба майдонҳо ва татбиқи Getters-setters намунаи маъмултарини истифода privateдар кори воқеӣ аст. Яъне татбиқи инкапсуляция дар барнома ҳадафи асосии ин тағирдиҳанда мебошад. Дар омади гап, ин на танҳо ба майдонҳо дахл дорад. Тасаввур кунед, ки дар барномаи шумо усуле мавҷуд аст, ки баъзе функсияҳои хеле мураккабро амалӣ мекунад. Барои мисол овардани ин ... Фарз мекунем, ки усули шумо readDataFromCollider()суроғаеро бо додаҳо ҳамчун вуруд мегирад, маълумотро аз Коллайдери Калон дар формати byte мехонад, ин маълумотро ба матн табдил медиҳад, онро ба файл менависад ва чоп мекунад. Ҳатто тавсифи усул даҳшатовар ба назар мерасад, бигзор code бошад :) Барои баланд бардоштани хониши code, хуб мебуд, ки мантиқи мураккаби усулро дар як ҷо нанависед, балки баръакс, функсияро вайрон кунед. ба усулҳои алоҳида. Масалан, усул readByteData()барои хондани маълумот, convertBytesToSymbols()табдил додани маълумоти аз коллайдер хондашуда ба матн, saveToFile()захира кардани матни натиҷавӣ ба файл ва printColliderData()чопи файли додаҳои мо масъул аст. Ин усул readDataFromCollider()хеле соддатар мешавад:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // convert bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // save the read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // print data from file
   }
}
Аммо, тавре ки шумо аз лексия дар бораи интерфейсҳо дар хотир доред, корбар танҳо ба интерфейси ниҳоӣ дастрасӣ пайдо мекунад. Ва 4 усули мо қисми он нестанд. Онҳо ёрирасонанд : мо онҳоро барои беҳтар кардани хониши code ва пешгирӣ кардани печонидани чор вазифаи гуногун ба як усул офаридаем. Ба корбар дастрасии ин усулҳоро додан лозим нест. Агар корбар ҳангоми кор бо коллайдер ба усул дастрасӣ дошта бошад convertBytesToSymbols(), вай эҳтимолан намефаҳмад, ки ин усул чист ва чаро он лозим аст. Кадом byteҳо табдил дода мешаванд? Онҳо аз куҷо омадаанд? Чаро онҳоро ба матн табдил диҳед? Мантиқе, ки дар ин усул кор мекунад, қисми интерфейси корбар нест. Танҳо усул readDataFromCollider()як қисми интерфейс аст. Бо ин чор усули «дохилй» чй бояд кард? Дуруст! Дастрасиро ба онҳо бо тағирдиҳанда маҳдуд кунед private. Бо ин роҳ онҳо метавонанд кори худро дар дохor синф ба осонӣ анҷом диҳанд ва корбарро, ки ба мантиқи ҳар яки онҳо дар алоҳидагӣ эҳтиёҷ надорад, ошуфта насозанд.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // convert bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // save the read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // print data from file
   }
}

Тағйирдиҳанда муҳофизат карда шудааст

Тағйирдиҳандаи навбатии дастрасии маҳдудкунанда аст protected. Тағирдиҳандаҳои дастрасӣ.  Хусусӣ, ҳифзшуда, пешфарз, ҷамъиятӣ - 3 Майдонҳо ва усулҳое, ки бо тағирдиҳандаи дастрасӣ таъин шудаанд, protectedнамоён хоҳанд шуд:
  • дар тамоми синфҳое, ки дар як бастаи мо ҳастанд;
  • дар дохor хамаи синфхои вориси синфи мо.
Тасаввур кардан дарҳол душвор аст, ки кай ин лозим аст. Ҳайрон нашавед: protectedҳолатҳои татбиқ нисбат ба - хеле камтаранд privateва онҳо мушаххасанд. Тасаввур кунед, ки мо як синфи абстрактӣ дорем AbstractSecretAgent, ки агенти махфии ягон агентии иктишофиро ифода мекунад ва инчунин бастае top_secret, ки ин синф ва наслҳои онро дар бар мегирад. Синфхои конкретй - FBISecretAgent, MI6SecretAgent, MossadSecretAgentва гайра аз он мерос мондаанд. Дар дохor синфи абстрактӣ мо мехоҳем ҳисобкунаки агентро татбиқ кунем. Вақте ки an objectи агенти нав дар ҷое дар барнома сохта мешавад, он зиёд мешавад.
package top_secret;

public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
Аммо агентҳои мо махфӣ ҳастанд! Ин маънои онро дорад, ки танҳо онҳо ва ҳеҷ каси дигар набояд аз шумораи онҳо огоҳ бошад. Мо метавонем ба осонӣ тағирдиҳандаро protectedба майдон илова кунем agentCountва он гоҳ an objectҳои дигар синфҳои агенти махфӣ ё он синфҳое, ки дар бастаи "махфӣ"-и мо ҷойгиранд, метавонанд арзиши худро гиранд top_secret.
public abstract class AbstractSecretAgent {

   protected static int agentCount = 0;
}
Маҳз барои чунин вазифаҳои мушаххас тағирдиҳанда лозим аст protected:)

тағирдиҳандаи намоёни баста

Оянда дар рӯйхати мо тағирдиҳанда defaultё тавре ки онро низ меноманд, аст package visible. Он бо калимаи калидӣ нишон дода намешавад, зеро он ба таври нобаёнӣ дар Java барои ҳама майдонҳо ва усулҳо муқаррар карда шудааст. Агар шумо дар codeи худ нависед -
int x = 10;
... тағирёбанда xҳамон дастрасӣ дорад package visible. Агар усул (ё тағирёбанда) бо ягон тағирдиҳанда қайд карда нашавад, он бо "тағирдиҳандаи пешфарз" ишорашуда ҳисобида мешавад. Тағйирёбандаҳо ё усулҳое, ки чунин тағирдиҳанда доранд (яъне бидуни ҳеҷ чиз) ба ҳама синфҳои бастае, ки дар он эълон карда шудаанд, намоёнанд. Ва танҳо ба онҳо. Истифодаи он маҳдуд аст, мисли тағирдиҳанда protected. Аксар вақт, default-access дар бастае истифода мешавад, ки дар он баъзе синфҳои коммуналӣ мавҷуданд, ки функсияҳои ҳамаи синфҳои дигарро дар ин баста амалӣ намекунанд. Як мисол меорем. Тасаввур кунед, ки мо бастаи " хизматрасонӣ " дорем . Дар дохor он синфҳои гуногун мавҷуданд, ки бо пойгоҳи додаҳо кор мекунанд. Масалан, синфе вуҷуд дорад UserService, ки маълумоти корбарро аз пойгоҳи додаҳо мехонад, синфе CarService, ки маълумотро дар бораи мошинҳоро аз як пойгоҳи додаҳо мехонад ва синфҳои дигар вуҷуд доранд, ки ҳар яки онҳо бо навъи an objectҳои худ кор мекунанд ва маълумотро дар бораи онҳо аз базаи маълумот мехонанд.
package services;

public class UserService {
}

package services;

public class CarService {
}
Бо вуҷуди ин, вазъият метавонад ба осонӣ рух диҳад, вақте ки маълумот дар базаи маълумот дар як формат аст, аммо мо ба он дар формати дигар ниёз дорем. Тасаввур кунед, ки санаи таваллуди корбар дар базаи маълумот дар формати TIMESTAMP WITH Zone...
2014-04-04 20:32:59.390583+02
...ба чои мо an objectи оддитарин лозим аст - java.util.Date. Бо ин мақсад, мо метавонем дар дохor баста servicesсинфи махсус эҷод кунем Mapper. Вай барои табдил додани маълумот аз пойгоҳи додаҳо ба an objectҳои Java, ки мо бо онҳо шинос ҳастем, масъул хоҳад буд. Синфи ёрирасони оддӣ. Мо одатан ҳама синфҳоро ҳамчун , эҷод мекунем public class ClassName, аммо ин шарт нест. Мо метавонем синфи ёрирасони худро танҳо ҳамчун class Mapper. Дар ин ҳолат, он ҳоло ҳам кори худро иҷро мекунад, аммо берун аз баста ба касе намоён нест services!
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
Ва ин, дар асл, мантиқи дуруст аст: чаро касе берун аз баста синфи ёрирасонро мебинад, ки танҳо бо синфҳои як баста кор мекунад?

тағирдиҳандаи ҷамъиятӣ

Ва охирин дар рӯйхат, аммо на камтар аз он - тағирдиҳанда public! Шумо бо ӯ дар рӯзи аввали таҳсил дар JavaRush вохӯрдед public static void main(String[] args). Тағирдиҳандаҳои дастрасӣ.  Хусусӣ, муҳофизатшуда, пешфарз, ҷамъиятӣ - 4 Акнун, ки шумо лексияҳоро дар бораи интерфейсҳо омӯхтед, ҳадафи он барои шумо равшан аст :) Охир, publicон барои он сохта шудааст, ки ба корбарон чизе диҳад. Масалан, интерфейси барномаи шумо. Фарз мекунем, ки шумо барномаи тарҷумонӣ навиштаед ва он метавонад матни русиро ба англисӣ тарҷума кунад. Шумо усулеро офаридаед translate(String textInRussian), ки дар доираи он мантиқи зарурӣ амалӣ карда мешавад. Шумо ин усулро бо калима қайд кардаед publicва ҳоло он қисми интерфейс мегардад:
public class Translator {

   public String translate(String textInRussian) {

       // translates text from Russian to English
   }
}
Шумо метавонед зангро ба ин усул бо тугмаи "тарҷума" дар экрани барнома пайваст кунед - ва ҳамин тавр! Ҳар кас метавонад онро истифода барад. Қисмҳои рамзи бо тағирдиҳанда ишорашуда publicбарои корбари ниҳоӣ пешбинӣ шудаанд. Барои мисол аз ҳаёт, privateин ҳама равандҳое мебошанд, ки дар дохor телевизор ҳангоми кор кардан ба амал меоянд ва publicинҳо тугмаҳои пулти телевизор мебошанд, ки корбар метавонад онро идора кунад. Дар баробари ин ба вай лозим нест, ки телевизор чй тавр кор мекунад ва чй тавр кор мекунад. Идоракунии дурдаст маҷмӯи public-методҳо мебошад: on(), off(), nextChannel(), previousChannel(), increaseVolume(), decreaseVolume()ва ғайра.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION