Розділ 13 · 29 питань

Ім'ютабельність

29 питань і відповідей у розділі Ім'ютабельність.

Ukrainian Ім'ютабельність Вихідний Markdown
Мовні версії: English Russian Ukrainian

Питання цього розділу

  1. Що таке незмінний (ім’ютабельний) об’єкт?
  2. Які переваги дає використання незмінних об’єктів?
  3. Як створити незмінний клас в Java?
  4. Чому клас String є незмінним?
  5. Які наслідки має незмінність String?
  6. Чому незмінні об’єкти є потокобезпечними?
  7. Що таке ключове слово final і як воно допомагає у створенні незмінних класів?
  8. Чи достатньо зробити всі поля final для забезпечення незмінності?
  9. Що робити, якщо поле незмінного класу посилається на змінний об’єкт?
  10. Що таке захисна копія (defensive copy)?
  11. Коли потрібно робити захисну копію (defensive copy)?
  12. Як захистити колекцію від змін?
  13. Що таке Collections.unmodifiableList() і як це працює?
  14. В чому різниця між shallow copy та deep copy?
  15. Чи можна наслідуватися від незмінного класу?
  16. Чому незмінний клас повинен бути final?
  17. Що станеться, якщо перевизначити геттер в підкласі незмінного класу?
  18. Як працює String pool і як це пов’язано з незмінністю?
  19. Чи можна змінити значення String через рефлексію?
  20. Що таке Record і як він допомагає створювати незмінні класи?
  21. Чому LocalDate, LocalDateTime є незмінними?
  22. В чому перевага незмінних об’єктів для кешування?
  23. Як незмінність впливає на продуктивність?
  24. Що таке persistent data structures?
  25. Чи є недоліки у незмінних об’єктів?
  26. Як реалізувати Builder pattern для незмінного класу?
  27. Чи можна використовувати незмінні об’єкти як ключі в HashMap?
  28. Що станеться, якщо змінити змінний ключ в HashMap?
  29. Як правильно працювати з колекціями в незмінних класах?

Навігатор по розділу

29 запитань для підготовки до співбесіди на Middle Java Developer.


📋 Усі запитання

# Запитання Рівень складності
1 Що таке незмінний (ім’ютабельний) об’єкт
2 Які переваги дає використання незмінних об’єктів
3 Як створити незмінний клас в Java ⭐⭐
4 Чому клас String є незмінним ⭐⭐
5 Які наслідки незмінності String ⭐⭐
6 Чому незмінні об’єкти потокобезпечні ⭐⭐
7 Що таке ключове слово final і як воно допомагає ⭐⭐
8 Чи достатньо зробити всі поля final для незмінності ⭐⭐
9 Що робити, якщо поле класу посилається на змінний об’єкт ⭐⭐⭐
10 Що таке захисна копія (defensive copy) ⭐⭐
11 Коли потрібно робити захисну копію ⭐⭐
12 Як захистити колекцію від змін ⭐⭐
13 Що таке Collections.unmodifiableList() і як це працює ⭐⭐
14 В чому різниця між shallow copy та deep copy ⭐⭐
15 Чи можна успадковуватись від незмінного класу ⭐⭐
16 Чому незмінний клас повинен бути final ⭐⭐
17 Що станеться, якщо перевизначити гетер у підкласі ⭐⭐⭐
18 Як працює String pool і як це пов’язано з ім’ютабельністю ⭐⭐
19 Чи можна змінити значення String через рефлексію ⭐⭐⭐
20 Що таке Record і як він допомагає створювати незмінні класи ⭐⭐
21 Чому LocalDate, LocalDateTime незмінні ⭐⭐
22 В чому переваги незмінних об’єктів для кешування ⭐⭐⭐
23 Як ім’ютабельність впливає на продуктивність ⭐⭐⭐
24 Що таке persistent data structures ⭐⭐⭐
25 Чи є недоліки у незмінних об’єктів ⭐⭐
26 Як реалізувати Builder pattern для незмінного класу ⭐⭐
27 Чи можна використовувати незмінні об’єкти як ключі в HashMap ⭐⭐
28 Що станеться, якщо змінити змінний ключ в HashMap ⭐⭐⭐
29 Як правильно працювати з колекціями в незмінних класах ⭐⭐⭐

🗺️ Карта залежностей тем

                    ┌──────────────────────────────────────────┐
                    │   ОСНОВИ ІМ'ЮТАБЕЛЬНОСТІ (1-3)           │
                    │   1. Що таке immutable                   │
                    │   2. Переваги                          │
                    │   3. Як створити                           │
                    └──────────────────┬───────────────────────┘
                                       │
            ┌──────────────────────────┼──────────────────────────┐
            ▼                          ▼                          ▼
    ┌───────────────┐        ┌───────────────┐        ┌────────────────────┐
    │ STRING І DATE  │        │ FINAL І        │        │ DEFENSIVE COPY     │
    │ (4-5, 18, 21)  │        │ НАСЛІДУВАННЯ   │        │ І КОПІЮВАННЯ      │
    │ 4. String immut│        │ (7-8, 15-17)   │        │ (9-14, 29)         │
    │ 5. Наслідки │        │ 7. final       │        │ 9. Змінні поля│
    │ 18. String pool│        │ 8. Всі final?  │        │ 10. Defensive copy │
    │ 21. LocalDate  │        │ 15. Успадкув.  │        │ 11. Коли робити   │
    │                │        │ 16. Final class│        │ 12. Захист колекц │
    └───────┬───────┘        │ 17. Гетер     │        │ 13. unmodifiable   │
            │                └───────┬───────┘        │ 14. Shallow vs Deep│
            │                        │                │ 29. Колекції        │
            └────────────────────────┼────────────────└────────┬───────────┘
                                     │                        │
            ┌────────────────────────┼────────────────────────┘
            ▼                        ▼
    ┌───────────────┐        ┌───────────────┐
    │ THREAD-SAFE    │        │ ADVANCED       │
    │ І CACHING      │        │ (19-20, 24-28) │
    │ (6, 22-23)     │        │ 19. Рефлексія  │
    │ 6. Thread-safe │        │ 20. Record     │
    │ 22. Кешування│        │ 24. Persistent │
    │ 23. Perform.   │        │ 25. Недоліки │
    │                │        │ 26. Builder    │
    │                │        │ 27. Ключ HashMap│
    │                │        │ 28. Змінний  │
    └───────────────┘        └─────────────────┘

🎯 Рекомендований порядок вивчення

🟢 Рівень Junior (тижні 1-2)

Крок Тема Файли Мета
1 Основи Q1, Q2 Що таке immutable, навіщо потрібно
2 Створення Q3 Як створити незмінний клас
3 final Q7 Три контексти final
4 String Q4, Q5 Чому String immutable, наслідки
5 Thread-safe Q6 Чому immutable = thread-safe

🟡 Рівень Middle (тижні 3-4)

Крок Тема Файли Мета
1 Defensive copy Q9, Q10, Q11 Копіювання змінних полів
2 Колекції Q12, Q13, Q29 unmodifiableList, List.copyOf
3 Copy types Q14 Shallow vs deep copy
4 Builder Q26 Патерн для складних immutable об’єктів
5 Record Q20 Record vs Lombok @Value vs final class
6 LocalDate Q21 Чому Java Time immutable

🔴 Рівень Senior (тижні 5-6)

Крок Тема Файли Мета
1 Reflection attack Q19 Чи можна зламати immutable, module system
2 Успадкування Q15, Q16, Q17 Успадкування, sealed classes, overridden getters
3 Кешування Q22 Чому immutable ідеальні для кешу
4 Продуктивність Q23 Trade-offs, алокація vs contention
5 Persistent DS Q24 Structural sharing, Vavr
6 HashMap keys Q27, Q28 Immutable keys, mutable key mutation bug

🔗 Ключові зв’язки між темами

Тема: Основи

Q1 (Immutable) → Q2 (Переваги) → Q3 (Як створити)

Тема: final і успадкування

Q7 (final) → Q8 (Всі final?) → Q15 (Успадкування) → Q16 (Final class) → Q17 (Гетер)

Ключові зв’язки:

  • Q7 ↔ Q8: final поля ≠ незмінний клас (змінні посилання)
  • Q15 ↔ Q16: final class забороняє успадкування, sealed — обмежує
  • Q17 ↔ Q29: Гетер повертає змінний об’єкт — порушення immutable contract

Тема: Defensive Copy і колекції

Q9 (Змінні поля) → Q10 (Defensive copy) → Q11 (Коли робити)
     ↓
Q12 (Захист колекції) → Q13 (unmodifiableList) → Q14 (Shallow vs Deep) → Q29 (Колекції)

Тема: String і Date

Q4 (String immutable) → Q5 (Наслідки) → Q18 (String Pool)
Q21 (LocalDate immutable)

Тема: Advanced

Q19 (Рефлексія) → Q20 (Record) → Q24 (Persistent DS)
Q27 (HashMap keys) → Q28 (Mutable key mutation)

🎓 Шпаргалка: що знати для кожного рівня

🟢 Junior

  • Immutable = стан не змінюється після створення
  • Переваги: thread-safe, кешований, передбачуваний
  • final для класу, полів, методів — три різних значення
  • String immutable — безпека, String Pool, хешування

🟡 Middle

  • Defensive copy: копіюємо змінні поля в конструкторі та гетерах
  • List.copyOf() vs Collections.unmodifiableList() — незалежна копія vs жива обгортка
  • Shallow copy = копіює контейнер, deep copy = рекурсивно весь граф
  • Record = immutable value class з мінімумом boilerplate
  • Builder pattern для об’єктів з 4+ полями

🔴 Senior

  • Reflection на final полях заблокований (Java 16+, JEP 396)
  • Sealed classes (Java 17) як альтернатива final для immutable hierarchies
  • Persistent data structures: structural sharing, O(log n) модифікація
  • Mutable key в HashMap = логічна недоступність (не витік!)
  • Immutable objects = лінійне масштабування на read-heavy навантаженні
  • String Pool пов’язаний з ім’ютабельністю: один об’єкт → багато посилань безпечно

📝 Формат кожного файлу

Кожен файл містить:

  • 🟢 Junior Level — базове розуміння, прості аналогії, приклади
  • 🟡 Middle Level — нутрощі, типові помилки, практичні приклади
  • 🔴 Senior Level — deep dive, edge cases, досвід production, моніторинг
  • 🎯 Шпаргалка для інтерв’ю — ключові тези, часті запитання, червоні прапорці, пов’язані теми