[英]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.