Static members va static initialization blocks

~15 daq · TypeScript · OOP

Foydalanuvchi classining nechta instansi yaratilganini bilish kerak. Bu ma'lumot bitta instansga emas, classning o'ziga tegishli. Static members — class darajasida saqlanadi, instanslarda emas.


static xususiyat va metod

class Foydalanuvchi {
  static soni: number = 0;

  readonly id: number;
  ism: string;

  constructor(ism: string) {
    Foydalanuvchi.soni++;  // class orqali
    this.id  = Foydalanuvchi.soni;
    this.ism = ism;
  }

  static reset(): void {
    Foydalanuvchi.soni = 0;
  }
}

new Foydalanuvchi("Ali");
new Foydalanuvchi("Vali");
Foydalanuvchi.soni;   // 2 — class orqali, instans orqali emas
Foydalanuvchi.reset();
Foydalanuvchi.soni;   // 0

Singleton pattern

class DatabaseUlanish {
  private static instans: DatabaseUlanish | null = null;

  private constructor(private url: string) {}

  static olish(): DatabaseUlanish {
    if (!DatabaseUlanish.instans) {
      DatabaseUlanish.instans = new DatabaseUlanish(
        process.env.DATABASE_URL || "localhost"
      );
    }
    return DatabaseUlanish.instans;
  }

  so_rovYuborish(sql: string): void {
    console.log(`[${this.url}] ${sql}`);
  }
}

const db1 = DatabaseUlanish.olish();
const db2 = DatabaseUlanish.olish();
db1 === db2; // true — bir xil instans

static initialization block

Constructor dan oldin murakkab statik boshlang'ich qiymatlar uchun:

class Sozlamalar {
  static readonly HOST: string;
  static readonly PORT: number;
  static readonly SSL:  boolean;

  static {
    // Murakkab mantiq — try/catch, shartlar
    Sozlamalar.HOST = process.env.HOST ?? "localhost";
    Sozlamalar.PORT = parseInt(process.env.PORT ?? "5432");
    Sozlamalar.SSL  = process.env.NODE_ENV === "production";
  }
}

Sozlamalar.HOST; // "localhost" yoki env qiymati

static va meros

Static xususiyatlar meros orqali o'tilmaydi — to'g'ridan class orqali:

class A {
  static qiymat = 10;
}

class B extends A {
  static yangi = A.qiymat * 2; // ✅
}

B.qiymat; // ✅ meros olgan (prototip zanjiri orqali)
B.yangi;  // 20

Tez-tez uchraydigan xatolar

this bilan static xususiyatga kirish:

class A {
  static x = 0;

  metod() {
    this.x; // ❌ — instance da x yo'q
    A.x;    // ✅ — class nomi bilan
  }
}

Xulosa

class MyClass {
  static soni: number = 0;         // class darajasida
  static readonly MAX: number = 100;

  static {                          // static initialization block
    MyClass.soni = parseInt(env.X ?? "0");
  }

  static yaratish(): MyClass {      // factory method
    return new MyClass();
  }
}

// Kirish — class nomi orqali
MyClass.soni;
MyClass.yaratish();
// Instans orqali emas: new MyClass().soni ❌

Keyingi dars

43-dars: Abstract class — mavhum sinflar va metodlar