stack & queue
Ghi chú về cách chọn và dùng Stack, Queue, Deque trong Java: khi nào dùng ArrayDeque, PriorityQueue, BlockingQueue hay ConcurrentLinkedQueue cho hệ thống chịu tải cao.
Welcome to MikeDaDev's Blog – notes on Java, backend & system design.
ExploreGhi chú về cách chọn và dùng Stack, Queue, Deque trong Java: khi nào dùng ArrayDeque, PriorityQueue, BlockingQueue hay ConcurrentLinkedQueue cho hệ thống chịu tải cao.
Prototype Pattern trong Java: vì sao Cloneable bị coi là lỗi thiết kế của JDK, khác nhau giữa Shallow Copy và Deep Copy, và so sánh 4 cách nhân bản object dùng được trên production (Copy Constructor, Jackson, Kryo, Record Withers).
Đào sâu Builder Pattern trong Java: vì sao JavaBeans Pattern và Telescoping Constructor dễ gây lỗi, cách dùng Staged Builder để thiếu trường bắt buộc là compile không qua, và khi nào nên dùng Lombok @Builder hay Java Records.
Dependency Injection (DI) là pattern dùng để hiện thực nguyên tắc Inversion of Control (IoC). Object không tự `new` mấy thứ nó cần nữa, mà để một bên quản lý chung (như Spring Container) "tiêm" (inject) dependency vào qua constructor, setter hoặc field. Nhờ vậy các class ít dính chặt vào nhau (loose coupling), code linh hoạt, dễ sửa và nhất là dễ viết unit test.
Nhìn lại Factory Pattern từ góc độ kiến trúc: vì sao Factory kiểu switch-case kinh điển lại vi phạm chính Open/Closed Principle, cách inject Map bean trong Spring Boot để bỏ hẳn if-else, Functional Factory với Java Supplier, và phân biệt Factory Method với Abstract Factory qua ví dụ multi-cloud.
Singleton Pattern nhìn kỹ hơn một chút: vì sao việc đảo lệnh của JIT và CPU buộc Double-Checked Locking phải có volatile, 4 cách phá Singleton (Reflection, Serialization, Clone, ClassLoader) và vì sao dự án Spring nên để IoC Container quản lý singleton.
Code toàn if-else đọc mệt lắm. Bài này đưa ra vài cách thay thế: Enum, Factory Pattern, Strategy Pattern, Stream API và Map, kèm ưu nhược điểm của từng cách.
**SOLID** là 5 nguyên tắc thiết kế cơ bản của lập trình hướng đối tượng: Single Responsibility, Open-Closed, Liskov Substitution, Interface Segregation và Dependency Inversion. Áp dụng đúng thì code có cấu trúc rõ ràng, các phần ít dính vào nhau, nên dễ mở rộng, dễ test và dễ bảo trì về lâu dài.
Trace một request UPDATE (PUT hoặc PATCH) tới REST API từ client xuống tận disk: load balancer, Tomcat, filter chain, Spring MVC, transaction, Hibernate, PostgreSQL, MongoDB và đường quay về client.