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
相关产品推荐
相关产品推荐

