Sobes.tech
Junior

Java'da immutability qanday ta'minlanadi?

sobes.tech AI

AIdan javob

Java'da o'zgarmaslik quyidagi usullar bilan ta'minlanadi:

  1. Klassni final sifatida e'lon qilish: Klass meros olish mumkin emas, bu esa o'zgartiriladigan subclasslarning yaratilishini oldini oladi.

  2. Barcha maydonlarni final sifatida e'lon qilish: Maydonning qiymati faqat bir marta tayinlanishi mumkin (init qilishda yoki konstruktorda) va obyekt yaratilgandan so'ng o'zgartirilmaydi.

  3. Maydonlarning maxfiyligi: Maydonlar private bo'lishi kerak, shunda to'g'ridan-to'g'ri kirish va tashqaridan o'zgartirish oldini olinadi.

  4. Setterlar yoki obyekt holatini o'zgartiradigan metodlarning yo'qligi: Klass, obyekt yaratildgandan so'ng, maydonlarning qiymatini o'zgartiradigan jamoat metodlarini taqdim etmasligi kerak.

  5. O'zgartiriladigan maydonlar bilan to'g'ri ishlash: Agar klass o'zgartiriladigan obyektlarga (masalan, List yoki o'zining o'zgartiriladigan klassi) havolalar saqlasa, quyidagilar qilish kerak:

    • Ularni initsializatsiya paytida nusxalarini yaratish (konstruktorda).
    • Ularning nusxalarini getterlarda qaytarish, tashqaridan obyektning ichki holatini o'zgartirishni oldini olish uchun.
public final class ImmutableExample { // final klass

    private final String name; // final va private maydon

    private final List<String> items; // final va private maydon

    public ImmutableExample(String name, List<String> items) {
        this.name = name;
        // O'zgartiriladigan ro'yxatning himoyalangan nusxasini yaratish
        this.items = new ArrayList<>(items);
    }

    public String getName() {
        return name;
    }

    public List<String> getItems() {
        // O'zgartiriladigan ro'yxatning himoyalangan nusxasini qaytarish
        return Collections.unmodifiableList(new ArrayList<>(items));
    }

    // O'zgartirish holatini o'zgartiradigan setterlar yoki metodlar yo'q
}

Java'da ichki o'zgarmas klasslar misollari: String, primitiv turlarining qoplamalari (Integer, Long va boshqalar), BigInteger, BigDecimal.