Салом! Дар лексияи имрӯза мо бо мафҳуми « модификаторҳои дастрасӣ » шинос мешавем ва мисолҳои кор бо онҳоро дида мебароем. Ҳарчанд калимаи «биё шинос шавем» комилан дуруст нахоҳад буд: шумо бо аксарияти онҳо аллакай аз лексияҳои қаблӣ шинос ҳастед. Ба ҳар сурат, биёед хотираи худро дар бораи чизи асосӣ тароват кунем. Тағирдиҳандаҳои дастрасӣ аксар вақт калимаҳои калидӣ мебошанд, ки сатҳи дастрасӣ ба қисмҳои гуногуни codeи шуморо танзим мекунанд. Чаро "аксаран"? Зеро яке аз онҳо бо нобаёнӣ муқаррар карда мешавад ва бо калимаи калидӣ нишон дода намешавад :) Дар Java ҳамагӣ чор тағирдиҳандаи дастрасӣ мавҷуданд. Мо онҳоро ба тартиб аз сахттарин то "нарм" номбар мекунем:
- хусусӣ;
- ҳифзшуда;
- пешфарз (бастаи намоён);
- оммавй
Тағйирдиҳандаи хусусӣ
Private
— тағирдиҳандаи дастрасии маҳдудкунанда. Он намуди зоҳирии маълумот ва усулҳоро дар дох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
. Майдонҳо ва усулҳое, ки бо тағирдиҳандаи дастрасӣ таъин шудаанд, 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)
. Акнун, ки шумо лексияҳоро дар бораи интерфейсҳо омӯхтед, ҳадафи он барои шумо равшан аст :) Охир, 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()
ва ғайра.
GO TO FULL VERSION