1. Açar söz var
Java-da koda yazmağa yeni başlayanda bizi sərt tip sistemi qarşılayır: hər bir dəyişəni açıq şəkildə elan etmək — onun tipini göstərmək lazımdır. Bu etibarlılıq üçün faydalıdır, amma bəzən yazılar həddən artıq uzanır və kodu yükləyir. Həyatı asanlaşdırmaq üçün Java-ya rahat bir alət əlavə edilib — tipin avtomatik təyini (var).
var tip təhlükəsizliyindən imtina etmədən daha qısa və təmiz kod yazmağa imkan verir: siz dəyəri yazırsınız, kompilyator isə tipini özü təyin edir.
Nümunə
var age = 23; // kompilyator 23 ədədinin tipini müəyyənləşdirəcək və int age qoyacaq
var name = "Anna"; // kompilyator "Anna" sətirinin tipini müəyyənləşdirəcək və String name qoyacaq
var price = 99.99; // kompilyator 99.99 ədədinin tipini müəyyənləşdirəcək və double price qoyacaq
Niyə var əlavə edilib?
- Oxunaqlılıq: əl ilə uzun tipləri (məsələn, HashMap<String, List<Integer>>) yazmağa ehtiyac yoxdur.
- Elastiklik: gələcəkdə tipləri dəyişməyi asanlaşdırır: sağ tərəfi düzəltdiniz — sol tərəfdə var artıq uyğunlaşacaq.
- Müasir üslub: demək olar ki, bütün müasir Java layihələri tipin başlanğıcdan aydın olduğu yerlərdə var-dan istifadə edir.
var-dan nə vaxt istifadə etmək olar (və lazımdır)
- Sağ tərəfdən dəyişənin tipinin aydın göründüyü hallarda.
- Tip açıq-aydın olduqda (var price = 100; — bunun int olduğu aydındır).
- Tip çox uzun və ya mürəkkəb olduqda (məsələn, HashMap<Integer, List<Calendar>>).
Massiv nümunəsi
var numbers = new int[] { 1, 2, 3, 4 };
Metod nümunəsi
var input = console.nextLine(); // input — bu, String-dir (metod String qaytarır)
var-dan istifadə ETMƏK YAXŞI DEYİL nə vaxt
Əgər tip sağ tərəfdən aydın deyilirsə, kod daha az anlaşılan ola bilər. Bir aydan sonra özünüz də orada hansı tipin olduğunu anlamayacaqsınızsa, daha yaxşıdır ki, açıq şəkildə göstərin.
var mystery = DoSomethingVeryComplicated(); // SƏN KİMSƏN, mystery???
Burada tipi açıq şəkildə göstərmək daha yaxşıdır:
String result = DoSomethingVeryComplicated();
Qızıl qayda: var-dan yalnız oxunaqlılığı pisləşdirmədiyi yerlərdə istifadə edin!
var — yalnız lokal dəyişənlər üçün
var açar sözü yalnız lokal dəyişənlər üçün — metodların içində işləyir. var-dan aşağıdakılar üçün istifadə etmək olmaz:
- metod parametrləri;
- sinif sahələri;
- sabitlər.
var “qapağın altında” necə işləyir
- Java kompilyatoru kompilyasiya zamanı düzgün tipi qoyur.
- Kompilyasiyadan sonra heç bir var qalmır.
- Performans itkisi yoxdur: bu yalnız proqramçı üçün rahatlıqdır.
var year = 2025; // kompilyasiya mərhələsində olur: int year = 2025;
var-dan istifadə zamanı tipik səhvlər
İlkinləşdirilməmiş dəyişən:
var a; // Xəta: kompilyator tip çıxara bilmir!
Qeyri-müəyyən ilkinləşdirmə:
var list = null; // Xəta: null tipini müəyyən etmək olmur!
Dəyişənin fərqli tiplərlə yenidən istifadəsi:
var value = 5; // value — int
value = "Beş"; // Xəta: value artıq int-dir!
Müqayisə: açıq tiplər və var
| Ssenari | Açıq tip | var |
|---|---|---|
| Tip aydındır | |
|
| Metod mürəkkəb tip qaytarır | |
|
| Massiv | |
|
2. Açar söz final: sabitlərin elanı
Sabit — ilkinləşdirmədən sonra dəyəri dəyişdirilə bilməyən dəyişəndir. Sabitlər kodu etibarlı və anlaşılan edir və vacib ədədlərin və sətirlərin təsadüfən dəyişdirilməsindən qoruyur.
- Pi ədədi (PI = 3.14159…)
- Maksimal istifadəçi sayı (MAX_USERS = 1000)
- Şirkətin adı (COMPANY_NAME = "CodeGym")
Java-da sabit elan etmək üçün final modifikatorundan istifadə olunur. Bu, kompilyatora deyir: “ilk mənimsətmədən sonra — daha dəyişmək olmaz!”
final Tip IMYA_KONSTANTY = znachenie;
Sintaksis
final int DAYS_IN_WEEK = 7;
final double PI = 3.1415926535;
final String GREETING = "Salam, Java!";
Vacib məqamlar:
- final ilə dəyişən mütləq ilkinləşdirilməlidir (dərhal və ya konstruktor daxilində — əgər bu, sinif sahəsidirsə).
- Dəyəri dəyişdirmək cəhdi kompilyasiya xətasına gətirib çıxaracaq.
Nümunə: final dəyişəni dəyişmək olmaz
final int MAX_USERS = 100;
MAX_USERS = 200; // Xəta: final dəyişənə yeni dəyər mənimsətmək olmaz
Şərh: əgər mənimsətməni şərhdən çıxarsanız — layihə yığılmayacaq.
3. static final: sinif səviyyəli sabitlər
Java-da tez-tez konkret obyektlərdən asılı olmayan — sinfin hamısı üçün “ümumi” sabitlər lazımdır. Bunun üçün static + final cütlüyündən istifadə olunur.
Niyə static final?
- static — dəyişən sinfə məxsusdur (hamı üçün bir dənə).
- final — dəyəri dəyişmək olmaz.
Sintaksis
public static final double PI = 3.1415926535;
public static final int MAX_USERS = 1000;
public static final String COMPANY_NAME = "CodeGym";
Harada elan etməli? Adətən — sinfin əvvəlində (metodlardan əvvəl).
Sinifdə istifadə nümunəsi
public class MathUtils
{
public static final double PI = 3.1415926535;
public static double circleLength(double radius)
{
return 2 * PI * radius;
}
}
Çağırış:
double len = MathUtils.circleLength(5);
System.out.println(len); // 31.4159...
Nəzərə alın: sabitə sinfin adı vasitəsilə müraciət edirik: MathUtils.PI.
4. Sadəcə final ilə static final arasındakı fərq
final — sahənin dəyərini ilkinləşdirmədən sonra dəyişmək olmaz, amma hər obyektin öz dəyəri var.
static final — bütün sinif üçün bir sabit, obyektlərdən asılı deyil.
Nümunə: praktik fərq
public class User
{
public final String name; // Hər User-in öz adı var (final)
public static final String COMPANY = "CodeGym"; // Hamı üçün bir şirkət (static final)
public User(String name)
{
this.name = name;
}
}
User u1 = new User("Vasya");
User u2 = new User("Petya");
System.out.println(u1.name); // Vasya
System.out.println(u2.name); // Petya
System.out.println(User.COMPANY); // CodeGym
Nəticə: name — fərdi dəyişməz sahə, COMPANY — ümumi sabitdir.
Sabitlərin adlandırılması üçün qaydalar
Sabitlər adətən BÖYÜK_HƏRFLƏRLƏ_VƏ_ALT_XƏTLA adlandırılır.
public static final int MAX_USERS = 1000;
public static final double GRAVITY = 9.81;
public static final String DEFAULT_GREETING = "Hello, world!";
Məsləhət: bu cür adı görəndə — dəyəri kodda dəyişməyə çalışmayın: kompilyator icazə verməyəcək.
5. Təcrübə: sabitlərin elanı və istifadəsi
Nümunə: sabitləri olan sinif
public class CircleCalculator
{
public static final double PI = 3.1415926535;
public static double getLength(double radius)
{
return 2 * PI * radius;
}
public static double getArea(double radius)
{
return PI * radius * radius;
}
}
İstifadə:
public class Main
{
public static void main(String[] args)
{
double r = 5.0;
System.out.println("Çevrənin uzunluğu: " + CircleCalculator.getLength(r));
System.out.println("Dairənin sahəsi: " + CircleCalculator.getArea(r));
}
}
Nəticə:
Çevrənin uzunluğu: 31.415926535
Dairənin sahəsi: 78.5398163375
Sabitin dəyişdirilməsinə cəhd
CircleCalculator.PI = 3.14; // Kompilyasiya xətası: cannot assign a value to final variable PI
6. Xüsusiyyətlər və incəliklər
Obyektlər üçün sabitlər
Obyekt istinadları üçün də final elan etmək olar, lakin bu, obyekti dəyişməz etmir! Bu, yalnız dəyişənə başqa istinad mənimsətməyi qadağan edir.
final StringBuilder sb = new StringBuilder("Hello");
sb = new StringBuilder("World"); // Xəta: yeni obyekt mənimsətmək olmaz
sb.append(", Java!"); // İcazəlidir — obyektin vəziyyəti dəyişir
System.out.println(sb); // Hello, Java!
Nəticə: final istinadı qoruyur, obyekti yox. Əsl dəyişməzlik üçün dəyişməz siniflərdən istifadə edin (məsələn, String, List.of() və s.).
“Sehrli ədədlər” əvəzinə sabitlərin istifadəsi
Pis üslub:
double area = 3.1415 * r * r; // 3.1415 nədir? Niyə məhz bu ədəd?
Yaxşı üslub:
double area = PI * r * r; // Dərhal aydın olur ki, Pi ədədindən istifadə edilir
7. Sabitlərlə və var ilə iş zamanı tipik səhvlər
Səhv №1: final dəyişənin dəyərini dəyişdirməyə cəhd. Dəyişən final ilə elan edilibsə, təkrar mənimsətmə kompilyasiya xətasına səbəb olacaq.
Səhv №2: sabiti var ilə elan etmək cəhdi. Sabitlər üçün həmişə açıq tipi final və ya static final ilə birlikdə istifadə edin. var — yalnız lokal dəyişənlər üçündür.
Səhv №3: sabitlərin yanlış adlandırılması. Sabitlər BÖYÜK_HƏRFLƏRLƏ_VƏ_ALT_XƏTLA olmalıdır. final int maxUsers = 100; kimi yazı oxunaqlılığı pisləşdirir.
Səhv №4: görünüş (scope) barədə unutmaq. Metod daxilində elan edilən sabit yalnız həmin metodda görünəndir. Bütün sinifdə istifadə üçün sinif səviyyəsində static final kimi elan edin.
Səhv №5: final-ın obyekti dəyişməz etdiyini düşünmək. final istinadı sabitləyir, obyektin vəziyyətini yox — bunlar fərqli anlayışlardır.
GO TO FULL VERSION