繁体   English   中英

android通过kotlin返回非空字体

[英]android return non-null typeface by kotlin

我正在尝试将Java代码转换为Kotlin代码:

class TypefaceProvider {
    companion object {
        private var tmpTypeface = Hashtable<String,Typeface>()
        @JvmStatic
        fun getTypeface(context : Context, dir : String, name : String) : Typeface {
            var createTypeface : Typeface? = tmpTypeface[name]
            if(createTypeface == null){
                createTypeface = try{
                    Typeface.createFromAsset(context.assets,"$dir/$name")
                } catch (e : Exception){
                    Log.e(TAG, "fail. msg:${e.message}")
                    Typeface.DEFAULT
                } finally {
                    tmpTypeface[name] = createTypeface 
                }
            }
            return createTypeface <--- wrong, type mismatch
        }
    }
}

我想返回一个非null的字体对象,

我已经检查过createTypeface不为null

如何解决返回类型不匹配的问题?

我应该使用return createTypeface!! 要么

createTypeface?:Typeface.DEFAULT (但Typeface.DEFAULT是重复的)

还是其他?

简短的答案是-如果您确定createTypeface确实不是null ,则返回createTypeface!! 是安全的。 您断言某些您知道是真实的事情。 看来您正在这样做,所以!! 在这种情况下应该可以正常工作。

通常,如果您希望Kotlin推断出某些东西不为null ,则需要确保您永远不会将null作为其可能的值。 您的示例的一种选择是将空检查折叠为?:运算符-

class TypefaceProvider {
    companion object {
        private var tmpTypeface = Hashtable<String, Typeface>()
        @JvmStatic
        fun getTypeface(context: Context, dir: String, name: String): Typeface {
            val createTypeface = tmpTypeface[name] ?: try {
                Typeface.createFromAsset(context.assets, "$dir/$name")
            } catch (e: Exception) {
                Log.e(TAG, "fail. msg:${e.message}")
                Typeface.DEFAULT
            }
            tmpTypeface[name] = createTypeface`
            return createTypeface
        }
    }
}

请注意,我们必须将tmpTypeface[name] = createTypeface移出finally块。 这会使您的缓存始终保存一个null值(请参见下面的@Alexy Romanov的注释)。 顺便说一句,我觉得最好不要在finally块中使用它,变量赋值内部的副作用似乎很奇怪。 另外,由于可以推断出createTypeface和显式类型,因此我们不必提供它。

如果您想让内容更具可读性,可以将加载/缓存逻辑分为一个单独的方法-

class TypefaceProvider {
    companion object {
        private var tmpTypeface = Hashtable<String, Typeface>()

        private fun loadTypeFace(context: Context, dir: String, name: String): Typeface {
            val typeface = try {
                Typeface.createFromAsset(context.assets, "$dir/$name")
            } catch (e: Exception) {
                Typeface.DEFAULT
            }
            tmpTypeface[name] = typeface
            return typeface
        }

        @JvmStatic
        fun getTypeface(context: Context, dir: String, name: String) = 
            tmpTypeface[name] ?: loadTypeFace(context, dir, name)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM