Statik sinf a'zolari
Oddiy usullar va maydonlardan tashqari, sinfda statik maydonlar, usullar, konstantalar bo'lishi mumkin. Bunday maydonlar, usullar va konstantalarning qiymatlari alohida ob'ektlarga emas, balki butun sinfga tegishli. Statik o'zgaruvchilar, doimiylar va usullarni aniqlash uchun ularni e'lon qilishdan oldin static kalit so'zi ko'rsatiladi.
Statik maydonlar
Statik maydonlar butun sinf holatini saqlaydi. Statik maydon oddiy maydon sifatida aniqlanadi, uning oldiga faqat statik kalit so'z qo'yiladi. Misol uchun, xodimni ifodalovchi Xodimlar sinfini ko'rib chiqing:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
void main (){
Employee bob = Employee("Bob", 55);
bob.checkAge();
Employee.retirenmentAge = 65;
bob.checkAge();
}
class Employee{
String name;
int age;
static int retirenmentAge = 60;
Employee(this.name, this.age);
checkAge(){
if(age >= retirenmentAge){
print("Пора на пенсию");
}
else{
print("До пенсии еще ${retirenmentAge - age} лет");
}
}
}
|
Xodimlar sinfi ism va yoshni saqlash uchun maydonlarni belgilaydi - har bir xodimning o'z ismi va yoshi bo'lishi mumkin. Bundan tashqari, pensiya yoshi pensiya yoshini saqlash uchun statik maydon belgilangan. Bu ma'lum bir xodimga emas, balki barcha xodimlarga, ya'ni butun Xodimlar sinfiga taalluqlidir, chunki har bir alohida xodim uchun o'z pensiya guruhini yaratish mumkin emas. Keyin, sinfning o'zida biz bu sohadan boshqalar kabi foydalanishimiz mumkin.
Agar biz ushbu maydonga sinfdan tashqarida murojaat qilmoqchi bo'lsak, masalan, uning qiymatini o'zgartirish uchun, u holda sinf nomi mos yozuvlar uchun ishlatiladi:
1
|
Employee.retirenmentAge = 65;
|
Statik konstantalar
Agar pensiya yoshini o'zgartirish rejalashtirilmagan bo'lsa, biz uni statik konstanta sifatida belgilashimiz mumkin:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
void main (){
Employee bob = Employee("Bob", 55);
bob.checkAge();
print("Retirenment age: ${Employee.retirenmentAge}");
}
class Employee{
String name;
int age;
static const int retirenmentAge = 65;
Employee(this.name, this.age);
checkAge(){
if(age >= retirenmentAge){
print("Пора на пенсию");
}
else{
print("До пенсии еще ${retirenmentAge - age} лет");
}
}
}
|
Statik konstantani aniqlash uchun siz static const yoki statik yakuniy ifodadan foydalanishingiz mumkin:
1
2
|
static const int retirenmentAge = 65;
static final int retirenmentAge = 65;
|
Statik usullar
Statik usullar ham butun sinf bo'lib, static kalit so'zi bilan prefikslangan. Odatda, statik usullar ob'ektning holatiga yoki harakatiga ta'sir qilmaydigan hisob-kitoblarni amalga oshiradi:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void main (){
int a = Operation.sum(3, 5);
int b = Operation.subtract(15, 7);
int c = Operation.multiply(3, 5);
print("a=$a b=$b c=$c"); // a=8 b=8 c=15
}
class Operation{
static int sum(int x, int y) => x + y;
static int subtract(int x, int y) => x - y;
static int multiply(int x, int y) => x * y;
}
|
Bunda jamlama, ayirish, ko‘paytirish usullari uchun Operation sinfining qaysi nusxasi qo‘llanilishi muhim emas. Ushbu usullar sinf holatiga ta'sir qilmasdan faqat parametrlar bo'yicha ishlaydi. Shuning uchun ularni statik deb belgilash mumkin.
Shuni ta'kidlash kerakki, Google yuqorida tavsiflangan Operatsion sinfi kabi faqat statik usullar va o'zgaruvchilar/konstantalarni o'z ichiga olgan sinflarni yaratishni tavsiya etmaydi. Chunki bu holda biz oddiy funktsiyalarni aniqlab, ulardan foydalanishimiz mumkin:
1
2
3
4
5
6
7
8
9
10
|
void main (){
int a = sum(3, 5);
int b = subtract(15, 7);
int c = multiply(3, 5);
print("a=$a b=$b c=$c"); // a=8 b=8 c=15
}
int sum(int x, int y) => x + y;
int subtract(int x, int y) => x - y;
int multiply(int x, int y) => x * y;
|
Statik usullardan statik maydonlarni, ya'ni butun sinfga tegishli holatni boshqarish uchun foydalanish mumkin. Shu bilan birga, biz statik usullarda statik bo'lmagan usullar va sinf maydonlaridan foydalana olmaymiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
void main (){
Employee bob = Employee("Bob", 55);
Employee.setRetirenmentAge(63);
print(Employee.retirenmentAge);
}
class Employee{
String name;
int age;
static int retirenmentAge = 65;
Employee(this.name, this.age);
checkAge(){
if(age >= retirenmentAge){
print("Пора на пенсию");
}
else{
print("До пенсии еще ${retirenmentAge - age} лет");
}
}
static void setRetirenmentAge(int value){
if(value > 50 && value < 70){
retirenmentAge = value;
}
else{
print("Некорректное значение");
}
}
}
|
Bunday holda, statik setRetirenmentAge usuli retirenmentAge statik o'zgaruvchisini manipulyatsiya qilish imkonini beradi.
Statik maydonlar va usullarning statik bo'lmaganlardan qanday afzalliklari bor? Statik maydonlar va usullar statik bo'lmaganlarga qaraganda kamroq xotirani iste'mol qiladi. Statik bo'lmagan o'zgaruvchi ishga tushirilgandan so'ng (qiymatning birinchi tayinlanishida) foydalanilgan yoki ishlatilmasligidan qat'i nazar, darhol xotirani iste'mol qila boshlaydi. Statik maydonlar va usullar dasturda foydalanilmaguncha ishga tushirilmaydi. Shunga ko'ra, ular faqat to'g'ridan-to'g'ri ishlatilganda xotirani iste'mol qila boshlaydilar.
|