Tag: java17
22 รายการ
Blog
Java Collectors.toUnmodifiableMap: ปิดการแก้โครงสร้างหลัง stream
ใช้ toUnmodifiableMap สร้างผลลัพธ์ที่เพิ่มหรือลบไม่ได้ พร้อมทดสอบ duplicate key, null และ mutable value
Java Collections.checkedList: กันชน type ตอนรับ List จาก legacy boundary
ใช้ checkedList ตรวจ element ตอนเขียนเข้าคอลเล็กชัน พร้อมทดสอบ raw alias และอธิบายว่ามันไม่แทน validation ของข้อมูลเดิม
Java Clock.fixed: หยุดเวลาใน test โดยไม่แตะนาฬิการะบบ
ฉีด Clock เข้า business logic แล้วใช้ Clock.fixed ทดสอบวันหมดอายุแบบ deterministic พร้อมแยก wall clock จาก elapsed time
Java Cleaner: มี fallback cleanup แต่ยังต้องปิด resource แบบ explicit
ใช้ java.lang.ref.Cleaner เป็น safety net โดยไม่จับ owner ค้าง พร้อม Java 17 assertions และขอบเขตที่ห้ามพึ่งเวลาของ GC
Java PathMatcher: คอมไพล์ glob ครั้งเดียวแล้วตรวจ path ตาม filesystem
ใช้ FileSystem.getPathMatcher กับ glob ตรวจไฟล์หลายเส้น พร้อมแยก matching จาก path containment และทดสอบ Java 17 จริง
Java Stream.iterate แบบมี hasNext: สร้างลำดับมีขอบเขตโดยไม่พึ่ง limit เดา ๆ
ใช้ Stream.iterate(seed, hasNext, next) สร้างช่วงตามเงื่อนไข พร้อม Java 17 assertions และขอบเขต overflow กับ non-progressing step
Java IdentityHashMap: เมื่อ key ต้องเป็น object เดิม ไม่ใช่ object ที่ equals กัน
ใช้ IdentityHashMap เฉพาะงาน topology และ graph traversal พร้อมทดสอบความต่างจาก HashMap และข้อห้ามใน business data
Java BitSet.nextSetBit: เดินเฉพาะตำแหน่งที่เปิดโดยไม่สแกนทุกช่อง
ใช้ BitSet.nextSetBit วน sparse flags พร้อมหลีกเลี่ยง off-by-one และแยก index set จาก business identity
Java ClassValue: ผูก cache กับ Class โดยไม่สร้าง static map ถือ class loader ไว้
ใช้ ClassValue คำนวณ metadata ต่อ Class แบบ lazy พร้อม remove, concurrency contract และ Java 17 assertions
Java ConcurrentHashMap.newKeySet: ทำ concurrent set โดยไม่ใส่ Boolean หลอก
ใช้ key set สำหรับ dedup ข้ามหลาย thread พร้อมทดสอบ add semantics และแยกจาก map ที่ต้องเก็บ metadata
Java NavigableMap.subMap: เปิดหน้าต่างช่วงคีย์แบบ live view
เลือกข้อมูลตามขอบเขต inclusive/exclusive โดยไม่ copy พร้อมทดสอบการแก้ผ่าน view และการปฏิเสธคีย์นอกช่วง
Java Pattern.asMatchPredicate: ใช้ regex แบบตรงทั้งข้อความใน Stream
แยก full match จาก find semantics ให้ชัด พร้อมทดสอบ filter ของรหัสงานและกรณีมีข้อความเกิน
Java Exchanger: นัดแลกข้อมูลระหว่างสองงานแบบเจอกันพอดี
ใช้ Exchanger ทำ two-party handoff พร้อม timeout และแยกจาก queue ที่รองรับหลาย producer/consumer
Java SynchronousQueue: ส่งต่อแบบไม่มีชั้นวางพัก
เข้าใจ zero-capacity handoff, fairness และ timeout สำหรับ producer-consumer ที่ต้องเจอกันจริง
Java OptionalInt.stream: ต่อค่าที่อาจไม่มีเข้ากับ IntStream
แปลงผล parse แบบ zero-or-one ให้เข้ากับ primitive stream โดยไม่ใช้ sentinel หรือ boxing เกินจำเป็น
Java completeOnTimeout: ใส่ค่าสำรองเมื่องานช้าเกินเวลา
ใช้ CompletableFuture.completeOnTimeout กันอนาคตค้าง พร้อมทดสอบว่าค่าสำรองเข้าเมื่อหมดเวลาและค่าจริงชนะถ้าเสร็จก่อน
Java CyclicBarrier: นัดพบครบจำนวนแล้วค่อยไปต่อด้วยกัน
ใช้ CyclicBarrier ให้หลาย thread รอจนครบ parties แล้วผ่านเฟสร่วม พร้อมทดสอบว่า barrier รีเซ็ตใช้ซ้ำได้
Java ReentrantLock.tryLock: ลองคว้ากุญแจ ถ้าไม่ได้ก็ไม่ยืนรอ
ใช้ tryLock และ tryLock(timeout) ลดการค้างรอเมื่อต้องแย่งทรัพยากร พร้อมทดสอบว่า thread ที่พลาดล็อกเดินต่อได้
Java Predicate.not: ปฏิเสธเงื่อนไขโดยยังอ่านเป็นประโยค
ใช้ Predicate.not กับ method reference ใน stream พร้อมแยก null policy ให้เห็นชัด
Java LongAccumulator: รวมสถิติที่มีคนอัปเดตพร้อมกัน
ใช้ accumulator แบบ associative ลด contention พร้อมเข้าใจว่า get ไม่ใช่ snapshot สำหรับ coordination
Java ExecutorCompletionService: รับผลตามงานที่เสร็จก่อน
แยกคิวส่งงานจากคิวผลลัพธ์ เพื่อไม่ให้งานช้าตัวแรกบังผลที่เสร็จแล้ว

Sealed interface ใน Java 17: ปิดชุดชนิดย่อยและบังคับพฤติกรรมร่วม
ใช้ sealed interface กับ permits ใน Java 17 และวาง method contract ให้ชนิดย่อยทุกแบบอธิบายผลลัพธ์ได้