Android中View.onDraw()的Canvas参数可空与非空版本哪个正确?
两种onDraw()写法的区别与正确性分析
嘿,这个问题问得挺到位的!其实两种写法都能正常运行,但谷歌示例里的非空版本更贴合Android框架的实际运行逻辑,下面给你掰扯清楚:
Android Studio自动生成的版本:
override fun onDraw(canvas: Canvas?) { super.onDraw(canvas) }
这个写法是严格遵循了View父类的方法签名——在Android SDK的View源码中,onDraw()的参数确实被定义为可空的Canvas?。IDE自动生成代码时会完全匹配父类的签名,所以会给你加上可空标记。谷歌示例中的版本:
override fun onDraw(canvas: Canvas) { super.onDraw(canvas) }
这个写法虽然看起来“违背”了父类签名,但其实是基于Android框架的实际调用逻辑:当系统调用View的onDraw()方法时,一定会传入一个有效的、非空的Canvas实例,永远不会出现null的情况。谷歌的示例这么写,是为了让代码更简洁,避免你每次都要做不必要的null判断。
总结一下
如果你追求和父类签名完全一致,用Android Studio生成的可空版本没问题;但从实际开发的角度来说,谷歌示例的非空版本更实用——你不用额外处理null,代码更清爽,而且框架层面已经保证了参数不会为空,完全不用担心空指针问题。
内容的提问来源于stack exchange,提问作者tehnolog
相关产品推荐
相关产品推荐

