You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中用Kotlin实现返回非空Typeface及Java转Kotlin代码练习

把Java TypefaceProvider转换成Kotlin并确保返回非空Typeface

没问题,我帮你把这段Java代码转换成符合Kotlin风格的实现,同时保证返回的Typeface一定是非空的——毕竟Android里用非空类型更安全,也贴合Kotlin的设计理念。

先看完整的转换后代码:

class TypefaceProvider {
    companion object {
        // 用MutableHashMap替代Hashtable,Kotlin里更常用;如果需要线程安全可以换成ConcurrentHashMap
        private val tmpTypeface = mutableMapOf<String, Typeface>()
        private const val TAG = "TypefaceProvider"

        @JvmStatic
        fun getTypeface(context: Context, dir: String, name: String): Typeface {
            var createTypeface = tmpTypeface[name]
            if (createTypeface == null) {
                createTypeface = try {
                    Typeface.createFromAsset(context.assets, "$dir/$name")
                } catch (e: Exception) {
                    Log.e(TAG, "加载字体失败: ${e.message}")
                    Typeface.DEFAULT
                } finally {
                    // 不管加载成功还是失败,都把结果存入缓存
                    createTypeface?.let { tmpTypeface[name] = it }
                }
            }
            // 这里createTypeface不可能为空:要么缓存里有,要么try块返回非空,要么catch返回DEFAULT
            return createTypeface!!
        }
    }
}

关键细节说明:

  • 非空保证:函数返回类型直接写Typeface(而非Typeface?),因为所有分支都能得到非空值:缓存命中时直接取非空的缓存值;缓存未命中时,try块加载成功返回有效Typeface,失败则返回Typeface.DEFAULT(系统默认字体,绝对非空)。最后用!!是安全的,因为我们已经确保了createTypeface不可能为空。
  • 缓存优化:把Java的Hashtable换成Kotlin的mutableMapOf(本质是HashMap),如果你的场景需要线程安全,可以换成ConcurrentHashMap(比Hashtable性能更好)。
  • 代码简洁性:Kotlin的字符串模板"$dir/$name"和Java用法一致,但写法更自然;let函数用于安全地将结果存入缓存(虽然这里createTypeface不会为空,但用let是个好习惯)。
  • 兼容性保留:保留@JvmStatic注解,这样Java代码依然可以像原来一样调用TypefaceProvider.getTypeface(...),不会破坏原有兼容性。
  • 补全逻辑:你原来的Java代码里finally块没写完,我帮你补全了——不管字体加载成功还是失败,都把最终的Typeface存入缓存,这样下次请求同一个字体时直接用缓存,不用重复尝试加载。

这样实现后,你调用getTypeface时就完全不用担心空值问题,直接拿到可用的Typeface啦~

内容的提问来源于stack exchange,提问作者KBKai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:30:55