เคล็ดลับ Java สำคัญ 8 ข้อ
- Array vs ArrayList
Array: ขนาดคงที่, primitive ได้, เร็วกว่าเล็กน้อย
ArrayList: ขนาดยืดหยได้, เฉพาะ object, rich API
→ ใช้ ArrayList เป็นหลัก เฉพาะ critical performance ใช้ array - ใช้ String ให้ถูกต้อง
String immutable - การต่อสตริงในลูปสร้าง object เยอะ → ใช้StringBuilder
"a" + "b"คอมไพเลอร์ optimize ให้ (compile-time constant)
s1 + s2runtime → สร้าง StringBuilder ใหม่ทุกครั้ง - Try-Finally vs Try-With-Resources
Java 7+: ใช้try (Resource r = ...) { }ปิด resource อัตโนมัติ (AutoCloseable)
หลีกเลี่ยง finally block แบบ manual close ที่อาจลืมหรือ exception ทับซ้อน - คืน Empty Collection แทน Null
return Collections.emptyList();แทนreturn null;
Caller ไม่ต้อง null-check, ใช้ for-each ได้เลย ป้องกัน NPE - หลีกเลี่ยง Memory Leaks
- Listener/Callback ไม่ถูก unregister
- Static collection เก็บ object ไม่เคย clear
- ThreadLocal ไม่ remove()
- Cache ไม่มี eviction policy
→ ใช้ WeakReference, Cleaner, หรือ profiling tools (JProfiler, VisualVM) - ป้องกัน Deadlock
- Lock ordering: acquire locks ตลอดในลำดับเดียวกัน
- ใช้tryLock(timeout)แทน lock แบบ blocking
- ลด scope ของ synchronized block ให้น้อยที่สุด - จัดการ NullPointerException
- ใช้Objects.requireNonNull(),Optional<T>
- Аннотация @NonNull, @Nullable (SpotBugs, IntelliJ)
- Defensive copy สำหรับ mutable parameters - Regex ใช้ให้เหมาะสม
- Simple case: ใช้String.contains(),startsWith(),split()
- Complex: compile pattern ใหม่ทุกครั้งช้า → ใช้Pattern.compile()แบบ static final
- Catastrophic backtracking: หลีกเลี่ยง nested quantifiers(a+)+
เพิ่มเติม: Modern Java (8-21)
- Stream API:
list.stream().filter().map().collect() - Record (Java 14+): immutable data carrier
- Pattern Matching (Java 16+):
if (obj instanceof String s) - Text Blocks (Java 15+): multi-line string
"""...""" - Virtual Threads (Java 21+): lightweight threads