1. Giriş
Java 8-ə qədər interfeys yalnız “kontrakt” idi: yalnız abstrakt metodlar, heç bir reallaşdırma, heç bir məntiq, yalnız vədlər. Amma Java 8-dən başlayaraq interfeyslər bir qədər “müstəqil” oldular: artıq onlar təkcə default metodları deyil, həm də static metodları ehtiva edə bilirlər.
İnterfeyslərdə static metodlar — reallaşdırmalara (siniflərə) yox, elə interfeysin özünə məxsus olan metodlardır. Onlar obyekt yaratmağı tələb etmir və birbaşa interfeysin adı ilə çağırılır.
Analoji olaraq:
İnterfeyslərdə static metodlar ofisin divarına yapışdırılmış yaddaş vərəqi kimidir: hər bir əməkdaş (sinif) ondan istifadə edə bilər, amma həmin vərəq heç bir əməkdaşa şəxsi olaraq məxsus deyil.
İnterfeyslərdə static metodlar bu interfeyslə bağlı köməkçi funksiyaları bir yerdə toplamağa imkan verir və reallaşdıran siniflərin ad sahəsini “zibilləmir”.
İnterfeyslərdə static metodların sintaksisi
Static metodlar interfeysin daxilində static açar sözü ilə elan edilir. Onlar reallaşdırma (fiqurlu mötərizələr içində kod) ehtiva edə bilər və yalnız interfeysin adı ilə çağırıla bilər.
Nümunə:
public interface MathUtils {
static int sum(int a, int b) {
return a + b;
}
static double average(int a, int b) {
return (a + b) / 2.0;
}
}
İnterfeys static metodunun çağırılması:
int result = MathUtils.sum(5, 7); // 12
double avg = MathUtils.average(10, 20); // 15.0
Diqqət:
İnterfeysin static metodunu reallaşdıran sinif və ya obyekt vasitəsilə çağırmaq olmaz! Yalnız interfeysin adı ilə.
2. İnterfeysin static metodları default metodlardan nə ilə fərqlənir?
Static metodlar:
- Birbaşa interfeysin özünə məxsusdur.
- Reallaşdıran siniflər tərəfindən miras alınmır.
- Sinif obyektindən çağırıla bilməz.
- Reallaşdıran sinifdə override edilə bilməz.
- Yalnız interfeysin adı ilə çağırıla bilər.
default metodlar:
- İnterfeysi reallaşdıran sinifin obyektinə (nümunəsinə) məxsusdur.
- Reallaşdıran sinifdə override edilə bilər.
- Reallaşdıran sinifin obyekti vasitəsilə çağırıla bilər.
- Reallaşdıran siniflər tərəfindən miras alınır.
Nəticə: default metodlar obyektin imkanlarını genişləndirir, static metodlar — interfeysin özünü.
Müqayisə nümunəsi:
interface Printer {
default void print(String text) {
System.out.println("Default: " + text);
}
static void info() {
System.out.println("Printer interface v1.0");
}
}
class ConsolePrinter implements Printer {}
public class Main {
public static void main(String[] args) {
Printer.info(); // Static metodun interfeys vasitəsilə çağırılması
ConsolePrinter cp = new ConsolePrinter();
cp.print("Hello!"); // Default metodun obyekt vasitəsilə çağırılması
// cp.info(); // Səhv! Static metodu obyektdən çağırmaq olmaz
}
}
3. İnterfeyslərdə static metodlar nə üçün lazımdır?
Static metodlar interfeyslərə gəlməzdən əvvəl, interfeyslə bağlı utilitar funksiyanı əlavə etmək lazım olduqda, adətən Utils və ya Helper sonluqlu ayrıca siniflər yaradılırdı:
public interface Movable {
void move(int x, int y);
}
public class MovableUtils {
public static void resetPosition(Movable m) {
m.move(0, 0);
}
}
İndi bunu birbaşa interfeysin içində etmək olar:
public interface Movable {
void move(int x, int y);
static void resetPosition(Movable m) {
m.move(0, 0);
}
}
Bu, kodu daha məntiqli və əlaqəli edir: interfeysə aid metodlar artıq onun daxilində yaşayır.
Üstünlüklər:
- Utilitar funksiyaların interfeys müqaviləsi ilə yanaşı qruplaşdırılması.
- Reallaşdıran siniflərin ad sahəsini “zibilləmir”.
- Kodun oxunaqlığını və dəstəyini yaxşılaşdırır.
4. İnterfeys static metodlarının məhdudiyyətləri və xüsusiyyətləri
İnterfeys static metodları reallaşdıran siniflər tərəfindən miras alınmır.
Onları reallaşdıran sinifin obyekti və ya sinifin adı ilə çağırmaq olmaz. Yalnız interfeysin adı ilə!
İnterfeysdə static metodlar həmişə reallaşdırmaya malikdir: onlar abstract və ya default ola bilməz.
Onlar hər zaman reallaşdırma ehtiva edir.
Static metodlar interfeysin qeyri-static metodlarına və ya dəyişənlərinə müraciət edə bilməz.
Onlar yalnız interfeysin digər static üzvlərinə (məsələn, static final sabitlərə) müraciət edə bilərlər.
İnterfeys static metodları private ola bilər (Java 9+).
İnterfeysin içində istifadə üçün köməkçi private static metodlar yaratmaq olar.
5. Nümunə: Movable interfeysi üçün static metodlar
Gəlin, Movable interfeysinə necə static metodlar əlavə edəcəyimizə baxaq. Tutaq ki, bizdə müxtəlif siniflərin (məsələn, robotlar, heyvanlar, nəqliyyat) reallaşdırdığı Movable interfeysi var.
Addım 1. Static metodlu interfeys elan edək:
public interface Movable {
void move(int x, int y);
static void resetPosition(Movable obj) {
obj.move(0, 0);
}
static double distance(int x1, int y1, int x2, int y2) {
int dx = x2 - x1;
int dy = y2 - y1;
return Math.sqrt(dx * dx + dy * dy);
}
}
Addım 2. İnterfeysi sinifdə reallaşdıraq:
public class Robot implements Movable {
private int x, y;
public Robot(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public void move(int x, int y) {
System.out.println("Robot nöqtəyə hərəkət edir (" + x + "," + y + ")");
this.x = x;
this.y = y;
}
public void printPosition() {
System.out.println("Hazırkı mövqe: (" + x + "," + y + ")");
}
}
Addım 3. İnterfeysin static metodlarından istifadə edək:
public class Main {
public static void main(String[] args) {
Robot robby = new Robot(10, 15);
robby.printPosition();
// Mövqenin interfeysin static metodu ilə sıfırlanması
Movable.resetPosition(robby);
robby.printPosition();
// Nöqtələr arasındakı məsafənin interfeysin static metodu ilə hesablanması
double dist = Movable.distance(0, 0, 10, 15);
System.out.println("Məsafə: " + dist);
}
}
Nəticə:
Hazırkı mövqe: (10,15)
Robot nöqtəyə hərəkət edir (0,0)
Hazırkı mövqe: (0,0)
Məsafə: 18.027756377319946
Diqqət yetirin:
Biz Movable.resetPosition(robby) çağırırıq, robby.resetPosition() yox. Static metodlar konkret obyektə deyil, məntiqcə interfeysə aid əməliyyatlar üçün rahatdır.
6. İnterfeyslərdə private static metodlar
Bəzən interfeysdə yalnız daxili ehtiyaclar üçün köməkçi metodlardan istifadə etmək lazımdır (məsələn, bir neçə static və ya default metodda kodun təkrarlanmasının qarşısını almaq üçün). Java 9-dan başlayaraq interfeyslər private static metodları dəstəkləyir.
Nümunə:
public interface Logger {
static void logInfo(String message) {
log("INFO", message);
}
static void logError(String message) {
log("ERROR", message);
}
private static void log(String level, String message) {
System.out.println("[" + level + "] " + message);
}
}
İndi log() interfeysdən kənar üçün əlçatan deyil, lakin digər static metodların daxilində istifadə olunur.
7. Static metodlar Java-nın standart kitabxanasında harada var?
Static metodlar Java-nın standart kitabxanasında, xüsusilə kolleksiyalarda və funksional interfeyslərdə fəal şəkildə istifadə olunur.
Nümunələr:
- Comparator.comparing(), Comparator.reverseOrder() — Comparator interfeysinin static metodları.
- Predicate.isEqual() — Predicate interfeysinin static metodu.
- List.of(), Set.of(), Map.of() (Java 9+) — dəyişməz kolleksiyalar yaratmaq üçün static metodlar.
Comparator ilə nümunə:
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
Comparator<String> cmp = Comparator.reverseOrder();
int res = cmp.compare("a", "b"); // müsbət ədəd, çünki tərs ardıcıllıqda "a" > "b"
System.out.println(res);
}
}
8. İnterfeys static metodları ilə işdə tipik səhvlər
Səhv №1: reallaşdıran sinifin obyekti vasitəsilə static metod çağırmağa cəhd.
Bu işləməyəcək! İnterfeysin static metodu yalnız interfeysin adı ilə çağırılır, məsələn, Movable.resetPosition(obj), obj.resetPosition() deyil.
Səhv №2: reallaşdıran sinifdə interfeysin static metodunu override etməyə cəhd.
Static metodlar irsi alınmır və override edilmir! Əgər sinifdə eyni adlı static metod elan etsəniz, bu, interfeyslə əlaqəsi olmayan tamamilə başqa bir metod olacaq.
Səhv №3: static metodların qeyri-static üzvlərə müraciət edə bilmədiyini unutmaq.
İnterfeysin static metodları yalnız static üzvlərdən (məsələn, static final sabitlər) istifadə edə bilər, lakin qeyri-static metod və ya dəyişənlərə müraciət edə bilməz.
Səhv №4: default metodlarla qarışıqlıq.
default metodlar obyekt vasitəsilə çağırılır, static isə yalnız interfeysin adı ilə. Qarışdırmayın!
GO TO FULL VERSION