Ім'ютабельність
29 питань і відповідей у розділі Ім'ютабельність.
Питання цього розділу
- Що таке незмінний (ім’ютабельний) об’єкт?
- Які переваги дає використання незмінних об’єктів?
- Як створити незмінний клас в Java?
- Чому клас String є незмінним?
- Які наслідки має незмінність String?
- Чому незмінні об’єкти є потокобезпечними?
- Що таке ключове слово final і як воно допомагає у створенні незмінних класів?
- Чи достатньо зробити всі поля final для забезпечення незмінності?
- Що робити, якщо поле незмінного класу посилається на змінний об’єкт?
- Що таке захисна копія (defensive copy)?
- Коли потрібно робити захисну копію (defensive copy)?
- Як захистити колекцію від змін?
- Що таке Collections.unmodifiableList() і як це працює?
- В чому різниця між shallow copy та deep copy?
- Чи можна наслідуватися від незмінного класу?
- Чому незмінний клас повинен бути final?
- Що станеться, якщо перевизначити геттер в підкласі незмінного класу?
- Як працює String pool і як це пов’язано з незмінністю?
- Чи можна змінити значення String через рефлексію?
- Що таке Record і як він допомагає створювати незмінні класи?
- Чому LocalDate, LocalDateTime є незмінними?
- В чому перевага незмінних об’єктів для кешування?
- Як незмінність впливає на продуктивність?
- Що таке persistent data structures?
- Чи є недоліки у незмінних об’єктів?
- Як реалізувати Builder pattern для незмінного класу?
- Чи можна використовувати незмінні об’єкти як ключі в HashMap?
- Що станеться, якщо змінити змінний ключ в HashMap?
- Як правильно працювати з колекціями в незмінних класах?
Навігатор по розділу
29 запитань для підготовки до співбесіди на Middle Java Developer.
📋 Усі запитання
🗺️ Карта залежностей тем
┌──────────────────────────────────────────┐
│ ОСНОВИ ІМ'ЮТАБЕЛЬНОСТІ (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()vsCollections.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, моніторинг
- 🎯 Шпаргалка для інтерв’ю — ключові тези, часті запитання, червоні прапорці, пов’язані теми