Daily Digest

每日新聞摘要

2026年03月18日

今日總結

內容會跟隨語言切換。

📝今日焦點:Kotlin 2.3.20 名稱解構上線,Android 17 平台變更帶來隱私與佈局影響,Kotlin 基金會 GSoC 招募實務專案,並伴隨生態教學與資源更新,並附示例。 🔧效能最佳化:TOON 表格式明顯降低 token 成本,虛擬執行緒與 reactive 的效能與可擴展取捨,GraalVM native image 在反射處理上仍需額外配置與設計替代實測。 🏗架構設計:MyBatis‑Flex 與 Room 範例示範持久化與整合測試,Koin 註解式 DI 導入、發佈自動化與流程簡化提升可維護性與交付一致性。 🚀語言演進與品質:延伸函式的靜態解析與限制、data class 與 class 選擇準則、協程深度參考實例、調度器指南與 Accessibility ANR 排查建議。

01

Guide to MyBatis-Flex

Baeldung 作者:Francesco Galgani 發布:03-18 13:16

MyBatis-Flex 使用指南

本文以 Spring Boot 4 範例展示 MyBatis-Flex 的實體映射、CRUD、QueryWrapper 查詢與分頁功能。

重點摘要

建立 Spring Boot 4 專案並設定 MyBatis-Flex 與 H2 資料庫
透過 BaseMapper 與整合測試示範插入、查詢、更新與刪除
使用 QueryWrapper 建構條件查詢(含動態條件)與 mapper.paginate 分頁

MyBatis-Flex 在 MyBatis 基礎上提供更簡潔的資料存取模型。本文以 Spring Boot 4(需 Java 17 以上)建置範例專案,加入 mybatis-flex、Spring JDBC 與 H2 相依,並在 application.yml 設定內嵌 H2 資料庫與 SQL 初始化腳本。範例定義 Account 實體與繼承 BaseMapper 的 AccountMapper,並提供 schema 與 data 的 SQL 檔以供測試資料。透過 JUnit 整合測試示範基本 CRUD 操作,以及使用 QueryWrapper 組合多重條件、動態查詢與排序,並示範 mapper.paginate 回傳分頁記錄與頁面資訊。文章強調減少樣板程式、提升查詢可讀性,適合作為不以 JPA/Hibernate 為主的常見持久化實作範例,全文程式碼可於 GitHub 查閱。

02

Introduction to TOON Format in Java

Baeldung 作者:John DeRegnaucourt 發布:03-18 13:30

Java 中的 TOON 格式入門

TOON 是一種緊湊且可讀的格式,編碼與 JSON 相同的資料模型,但透過縮排與表格化布局大幅減少 token 使用。

重點摘要

以縮排與表格陣列替代 JSON 的標點,減少語法重複的 token
Java 實作包含官方 JToon 與穩定的 json-io(支援 Java 8+),範例採用 json-io
對於欄位一致的集合,表格式 TOON 可節省約 30–44% 的 token,並可整合到 Spring AI

TOON(Token-Oriented Object Notation)在語義上等同 JSON,但改以換行縮排與長度/欄位標頭的表格式陳列來避免在每個物件重複鍵名,對送入大型語言模型(LLM)的結構化資料特別省 token。本文比較 Java 生態中兩個實作:JToon(社群官方)與 json-io(成熟、支援 Java 8+),並用 json-io 展示序列化、反序列化、巢狀結構處理與使用 OpenAI 相容 tokenizer 的 token 計量。結果顯示對於大量同構物件列表,TOON 顯著降低 BPE token 數;相對於 CSV,TOON 在表格式資料接近其效率,但同時支援巢狀與混合結構。當 token 成本或上下文視窗有限時建議使用 TOON;若需廣泛互通或驗證工具則仍以 JSON 為主。

03

How to Implement Room Database CRUD in Android with RecyclerView (Step-by-Step Kotlin Guide)

Dev.to Kotlin 作者:Devika Android 發布:03-18 11:52

在 Android 中用 RecyclerView 實作 Room 資料庫 CRUD(Kotlin 步驟指南)

本指南示範如何結合 RecyclerView、LiveData 與 Coroutines,實現可即時更新的 Room 資料庫 CRUD 功能。

重點摘要

建立 Entity、DAO 與單例 AppDatabase
透過 LiveData 觀察資料變化並自動更新 RecyclerView
使用 Coroutines 與 lifecycleScope 執行非同步 CRUD 操作

本篇教學示範如何在 Android(Kotlin)中實作完整的 CRUD 流程:建立 User 實體(Entity)定義欄位與主鍵、撰寫 UserDao 提供 insert、update、delete(suspend)與回傳 LiveData 的查詢、搭配 AppDatabase(RoomDatabase)管理資料存取。示例採用 Thread-safe 的 DatabaseBuilder 單例模式確保單一資料庫實例,並在 Activity 中以 lifecycleScope 執行新增/更新/刪除操作,同時透過 getAllUsers().observe 觀察 LiveData,將資料傳給 UserAdapter 顯示於 RecyclerView。整體以 Coroutines 與 LiveData 建構可擴充、反應式的本地資料存取方案。

04

Kotlin Fundamentals Part 17 — Classes in Kotlin — Normal vs Data Class ️

Medium Kotlin 作者:Kishor Ramani 發布:03-18 12:24

Kotlin 基礎第17篇 — 類別:普通 class 與 data class 的比較

類別是物件的藍圖;文章探討何時在 Kotlin 中使用普通 class 或 data class。

重點摘要

類別是物件的藍圖
data class 適合承載資料並自動產生常用方法
普通 class 適用於行為、複雜或可變狀態與自訂邏輯

本文說明 Kotlin 中普通 class 與 data class 的差異,並提供實務選擇指引。類別是物件的藍圖;data class 適合以資料為主的型別,宣告簡潔且會自動產生 equals、hashCode、toString、copy 與 componentN 等常用函式,方便以值為基礎的比較與複製。若需要封裝行為、處理複雜或可變狀態、實作自訂相等性或利用繼承與額外方法,則普通 class 更為合適。文章同時說明不可變性、語法簡潔的優勢,以及在何種情況下自動產生的方法不敷使用,幫助開發者根據用途選擇最合適的類別類型。

05

9 Kotlin Coroutine Mistakes Android Developers Still Make (Even with Compose)

Medium Kotlin 作者:Rodrigo Kirch 發布:03-18 12:33

Android 開發者仍會犯的 9 個 Kotlin Coroutine 錯誤(即使在 Compose 中也會)

GlobalScope 濫用、Flow collector 洩漏、coroutineScope 與 supervisorScope 的混淆,及其他在真實 Android 應用中出現的細微 coroutine 錯誤。

重點摘要

濫用 GlobalScope 會產生無法取消的工作與記憶體洩漏
Flow 的 collectors 若未綁定生命週期容易洩漏
coroutineScope 與 supervisorScope 的差異常導致意外取消

文章列出九種常見的 Kotlin coroutine 錯誤,指出即便採用 Jetpack Compose,開發者仍會遇到這些陷阱。作者舉例說明像是 GlobalScope 的誤用會讓工作超出預期生命週期、Flow collector 若未妥善綁定生命週期或取消會造成洩漏、以及誤解 coroutineScope 與 supervisorScope 的行為會導致意外取消或錯誤傳播。文中強調需採用結構化併發與生命週期感知的 scope、明確處理例外並確保取消與資源清理機制,以避免難以察覺且會影響穩定性的問題。

06

Android App Development Training in Delhi | Best Android Course for Beginners & Developers

Medium Kotlin 作者:JustAcademy Software Training Institute 發布:03-18 13:23

德里 Android 應用程式開發訓練 | 適合初學者與開發者的最佳 Android 課程

此課程為在德里尋求 Android 應用程式開發訓練的學生、應屆生與開發者而設。

重點摘要

在德里提供 Android 應用程式開發訓練
對象為學生、應屆生、初學者與開發者
由 JustAcademy Software Training Institute 發表於 Medium

這則由 JustAcademy Software Training Institute 發表於 Medium 的短文,介紹在德里舉辦的 Android 應用程式開發訓練。標題稱為「德里 Android 應用程式開發訓練 | 適合初學者與開發者的最佳 Android 課程」,摘錄指出課程為學生、應屆生、初學者與開發者設計。本文僅為預覽並提示讀者至 Medium 上繼續閱讀完整文章;摘錄內未提供課程大綱、時程、學費、報名或先修條件等具體資訊。對該訓練感興趣的人應點開原文以取得完整細節與聯絡方式。

07

Jetpack Compose State Survival Guide: From remember to rememberNavBackStack

Medium Kotlin 作者:chanzmao 發布:03-18 14:34

Jetpack Compose 狀態存活指南:從 remember 到 rememberNavBackStack

在 Jetpack Compose 開發中,選擇將 UI 狀態儲存在哪裡是最關鍵的決策之一。

重點摘要

決定 UI 狀態的儲存位置至關重要。
內容涵蓋從 remember 到 rememberNavBackStack 的技術。
以生命週期與導覽範圍為基準提供選擇指引。

本文說明在 Jetpack Compose 中選擇儲存 UI 狀態的位置為何至關重要,並從 remember 到 rememberNavBackStack 介紹不同做法,討論它們與元件生命週期、導覽範圍及狀態在重組或導覽間的存活關係。文章提供判斷依據與實務方向,幫助開發者根據生命週期與持久性需求選擇合適的狀態儲存位置,以提升介面一致性並降低因狀態遺失導致的錯誤。

08

GraalVM Native Image, 리플렉션을 넘을 수 있는가?

Medium Kotlin 作者:주진현 發布:03-18 14:39

GraalVM Native Image:能克服反射限制嗎?

Kotlin + Spring 後端的未來(2/5 篇)。

重點摘要

探討 GraalVM Native Image 與反射相關問題
聚焦 Kotlin 與 Spring 的後端情境
本篇為五篇系列文章的第二篇

本文圍繞標題提出的問題,探討 GraalVM Native Image 是否能克服反射帶來的限制。文章以 Kotlin + Spring 的後端開發為場景,作為五篇系列的第二篇,描述了在使用 ahead-of-time 編譯與 native-image 工具時,反射如何成為相容性與功能上的挑戰。內容並未強調單一結論,而是說明問題面向、為何反射會阻礙原生映像,以及開發者在將 JVM 基礎的 Kotlin/Spring 應用目標化為 native image 時,可能需採取的設定、工具支援或設計替代方案等現實考量。

09

Kotlin Coroutines — Complete In-Depth Reference

Medium Kotlin 作者:Mahendra Sutar 發布:03-18 14:45

Kotlin 協程 — 完整深入參考

從基礎到內部實作 — 提供你在 Kotlin 專案中自信使用協程所需的一切。

重點摘要

涵蓋從基礎概念到內部實作
目標是讓開發者在專案中自信使用協程
作者 Mahendra Sutar,在 Medium 發表

這篇由 Mahendra Sutar 在 Medium 發表的文章,定位為 Kotlin 協程的完整且深入參考資料。文中強調內容範圍從基本概念延伸至內部實作細節,目的是讓使用 Kotlin 的開發者獲得在專案中自信運用協程所需的知識與脈絡。文章作為一個整合性的資源,適合希望從概覽到更深技術面理解協程的讀者,並引導讀者前往 Medium 閱讀完整內容。此篇偏向提供廣泛且有架構的參考,而非短篇教學。

10

Handling Accessibility Events Without ANR

Medium Kotlin 作者:Abdullah IŞIK 發布:03-18 14:53

在不發生 ANR 的情況下處理可及性事件

如果你曾經建立過 AccessibilityService,很可能遇到在本地難以重現的 ANR 報告。

重點摘要

AccessibilityService 容易引發難以重現的 ANR
分析事件處理導致 ANR 的根本原因
提出設計與診斷策略以避免 ANR

本文指出,開發 AccessibilityService 時常會遇到難以在本地重現的 ANR 報告,分析了事件處理造成 ANR 的常見根本原因,並提出避免 ANR 的一般做法。文章說明了為何處理可及性事件可能導致應用或系統卡頓、時序與環境差異如何讓重現變得困難,以及透過減少關鍵執行緒工作量、批次或延後非必要處理、加強偵錯與日誌、並在真實設備與實際情境驗證等策略,能降低發生 ANR 的機率。文章強調診斷與監控的重要性,以及採行漸進修正以定位問題與改進事件處理模式。

11

Virtual Threads가 리액티브를 죽이는가?

Medium Kotlin 作者:주진현 發布:03-18 14:58

Virtual Threads 會取代 Reactive 嗎?

本文探討在 Kotlin 與 Spring 的情境下,Java 的 virtual threads 是否使 reactive 編程顯得多餘。

重點摘要

Kotlin + Spring 系列第 3 篇
比較 virtual threads 與 reactive 編程
文章為 Medium 系列延續內容

這篇 Medium 文章是 Kotlin + Spring 系列的第三篇,討論 Java 的 virtual threads 是否會威脅到 reactive 編程的地位。文章說明 virtual threads 讓阻塞程式碼的成本降低,並與以非阻塞與背壓為核心的 reactive 模式做比較,同時提出效能、可擴展性、函式庫與框架支援,以及實務部署等面向的考量。作者未直接斷言哪方必勝,而是強調取捨取決於具體工作負載與生態成熟度,並引導讀者參考後續篇章與實例以獲得更完整的分析。

12

Koin Educational Series, Production Setup with Annotations and the New Compiler

Medium Kotlin 作者:Tezov 發布:03-18 15:10

Koin 教學系列:使用註解與新版編譯器的生產環境設定

本文正式開始以註解在公司級應用中使用依賴注入的教學系列。

重點摘要

啟動以註解為核心的依賴注入教學系列
強調公司級(生產)環境的設定與實務應用
介紹新版 Koin 編譯器與註解式 DI 的整合

本文為 Koin 教學系列的首篇,說明在公司級(production-grade)應用中以註解(annotations)實作依賴注入(DI)的方向與重點。文章宣告將介紹以註解為基礎的生產環境設定與新版編譯器的整合方式,目標是為開發團隊提供可在真實專案中採用的模式與流程,協助在大型或企業等級專案中導入 Koin 的註解式 DI,同時兼顧可維護性與可測試性。後續章節預計深入設定細節、工具協同與遷移建議,並示範如何在實際專案中應用這些做法。

13

Coroutine Dispatchers in Android: The Complete Guide

Medium Kotlin 作者:Sergey Nes 發布:03-18 15:13

Android 中的 Coroutine Dispatchers:完整指南

每位使用 coroutine 的 Android 開發者都遇過:打開 Repository,盯著 suspend fun,心想──我需要…

重點摘要

說明常見的 dispatcher 與其適用場景
何時切換執行緒上下文與如何避免阻塞
針對 UI、IO 與 CPU 工作提供實務建議

本指南說明在 Android 開發中如何選擇與使用 coroutine dispatcher,幫助開發者釐清不同 dispatcher 的用途與重要性。文章以常見情境為出發:面對一個 suspend 函式應該用 Main、IO 還是 Default,並說明各自對應的使用情境(例如 UI 更新、網路/檔案 IO、CPU 密集運算)。內容涵蓋 dispatcher 行為、上下文切換的實作模式、避免阻塞主執行緒與維持結構化併發的做法,並提出測試與效能上的注意事項。閱讀後,可更有把握地為不同任務選擇合適 dispatcher、減少執行緒誤用,並讓 coroutine 的使用在 Android 專案中更安全與可維護。

14

Google Summer of Code 2026 Is Here: Contribute to Kotlin

Kotlin Blog 作者:Ksenia Shneyveys 發布:03-18 13:11

Google Summer of Code 2026:為 Kotlin 做出貢獻

如果你是學生或符合資格的貢獻者,想在暑期投入真實開源專案,這是透過經驗工程師指導、對 Kotlin 生態產生實質影響的好機會。

重點摘要

Kotlin Foundation 參與 GSoC 2026,徵求暑期學生貢獻者。
專案包括編譯器模糊測試器、Swift→Kotlin 互通 PoC、Wasm 尾呼叫支援與教育調查報告。
重要日程:3/16 開放申請、3/31 截止、4/30 公布錄取、5/25 開始編碼。

Kotlin Foundation 參加 Google Summer of Code 2026,邀請學生與合格貢獻者在暑期參與 Kotlin 的真實開源專案,透過資深工程師指導取得補助並累積實務經驗。本年度專案示例包含:從頭建構的 Kotlin Compiler Fuzzer(Kai,困難,350 小時)、將 Swift API 匯入 Kotlin/Native 的概念驗證(困難,350 小時)、在 Kotlin/Wasm 後端設計與實作尾呼叫支援(中等,90 小時),以及調查 Kotlin 教學現況並建立可重用資料集的教育景觀報告(中等,175 小時)。申請流程:選擇專案、加入 Kotlin Slack 的 #gsoc 與導師連絡、準備程式範例並於 GSoC 網站在 3/31 前提交。非學生可關注 Kotlin 生態導師計畫;問題可在 Slack 或寄信至 gsoc@kotlinfoundation.org 詢問。

15

How I turned task-to-release routine into a single Android workflow

Medium Kotlin 作者:Nurattin 發布:03-17 23:19

我如何將從任務到發佈的例行程序整合為單一 Android 工作流程

我們的流程並非壞掉,而是由太多小的手動步驟組成。

重點摘要

流程不是壞掉,而是被過多小手動步驟拆散。
作者把從任務到發佈的過程整合為單一 Android 工作流程。
目的在減少手動負擔並讓發佈更一致、可維護。

作者說明如何把原本由許多繁瑣小步驟組成、手動密集的 Android 發佈例行程序,轉換為單一且連貫的工作流程。關鍵觀察不是流程失效,而是零散的手動步驟造成摩擦與風險。透過將分散且重複的作業合併與自動化,作者減少了重複操作、釐清了從任務到發布的端到端路徑,並提升發佈的一致性。文章也討論了推動自動化的動機、在以自動化取代人工檢查時需考量的取捨,以及實際上的經驗教訓。結論指出:把許多小手動步驟簡化為連貫的自動流程,可改善開發者體驗並提高發佈可靠度。

16

Beyond Positions: Kotlin’s New Name-Based Destructuring

Medium Kotlin 作者:Nav Singh 發布:03-18 01:24

超越位置:Kotlin 的新一代基於名稱的解構

在 Kotlin 2.3.20 中引入了基於名稱的解構宣告,它將變數對應至屬性名稱,而非依賴位置順序。

重點摘要

Kotlin 2.3.20 引入基於名稱的解構
根據屬性名稱綁定變數,而非位置索引
可提升可讀性並降低因順序變動造成的錯誤

Kotlin 在 2.3.20 版本新增了基於名稱的解構宣告,這種做法以屬性名稱來對應解構後的變數,而非傳統依序的位次(position)。透過名稱對應,可以降低資料結構順序變動時導致的脆弱性,並讓程式碼意圖更明確,增進可讀性與可維護性。文章說明了從位置導向解構轉向名稱導向的理由與實際好處,並指出此功能可與既有解構機制並存;有關語法範例與遷移建議請參閱原文。總體而言,基於名稱的解構透過將變數直接與屬性名稱連結,提供更安全且表意性更強的物件展開方式。

17

Android 17 for Developers: New APIs, Breaking Changes, and What to Migrate Now

Medium Kotlin 作者:Prakash Sharma 發布:03-18 02:01

Android 17 開發者須知:新 API、破壞性變更與必要遷移項目

API 等級 37 引入自適應佈局、無鎖訊息機制與更細緻的隱私控管,將影響應用行為與遷移優先順序。

重點摘要

自適應佈局改善不同裝置的介面呈現
無鎖訊息提高並發與效能穩定性
細緻隱私控管需檢視權限與資料存取流程

Android 17(API 等級 37)帶來三大開發重點:能更彈性應對多種螢幕與配置的自適應佈局、旨在提升並發與效能的無鎖訊息機制,以及改變應用資料存取模式的細緻隱私控管。此版本亦包含可能影響相容性的破壞性變更,建議開發者檢視受影響的 API、審核權限與隱私流程,並在實機或模擬器上測試應用。優先處理 UI 佈局、訊息/同步機制與隱私相關功能的遷移,以降低對使用者的影響並善用平台改進。

18

What are extension functions in Kotlin, and how do they work internally?

Medium Kotlin 作者:Satnam Singh 發布:03-18 04:04

Kotlin 的延伸函式是什麼,以及其內部運作方式

延伸函式可在不修改原始類別程式碼的情況下為現有類別新增功能;內部上會編譯成接受接收者作為參數的靜態函式。

重點摘要

在不變更類別原始碼下新增方法呼叫語法。
編譯為帶有接收者參數的靜態函式(synthetic 靜態方法)。
解析於編譯期決定,無法覆寫類別成員或存取 private 成員。

Kotlin 的延伸函式允許開發者在不更改類別原始碼也不繼承的情況下,為既有型別新增可呼叫的成員,並以接收者語法(obj.extension())直覺地使用。編譯器會把延伸函式轉換成接受接收者物件作為第一個參數的靜態函式,因此解析是靜態的(取決於編譯期型別),延伸函式無法覆寫類別的成員方法,也不能直接存取類別的 private 成員;延伸屬性則透過產生的存取器方法實作。此設計兼顧語法便利性與不改變執行時類別行為及二進位相容性。