先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数步伐员,想要提拔技能,每每是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易遇到天花板技能停滞不前!
因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初志也很简单,就是希望可以或许帮助到想自学提拔又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小同伴深入学习提拔的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习条记、源码课本、实战项目、大纲路线、讲解视频,而且后续会持续更新
如果你必要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
正文
println(TEST_4)
}
}
val test5 = “TEST_5”
private val test6 = “TEST_6”
}
复制代码
我们看一下生成的代码:
可以看到,在不加const修饰的情况下,生成了getTEST_1方法。那么调用TEST_1时,其实是调用CompanionTest.Companion.getTEST_1(),这样的代码说真话有点繁琐。
如何可以像Java那样直接读取静态属性,那就像TEST_2一样,加const修饰,这样这个变量就可以内联式的编译,也就不会生成多余的方法。
同时也必要留意一个test5、test6这两个写法的区别。
4.inline
inline 是方法的一个修饰符,用来让方法以内联的方式举行编译。什么是内联,简单说就像是复制了一份方法实现代码进来。
比如我们有一个盘算方法add:
fun add(a: Int, b: Int): Int {
return a + b;
}
复制代码
如果直接使用,反编译后代码如下:
UtilsKt.add(1, 4);
复制代码
如果添加一个inline 修饰符,反编译后代码如下:
byte a i v = 1 ; i n t b iv = 1; int b iv=1;intbiv = 4;
int var10000 = a i v + b iv + b iv+biv;
复制代码
其实一样平常的方法我们不必要添加inline ,否则一调用方法就“复制”一遍,这生成的代码就太多了,体积也会不停变大。所以AS也会给我们警告:
Expected performance impact from inlining is insignificant. Inlining works best for functions with parameters of functional types
复制代码
翻译过来就是:内联对性能的影响是很小的,内联最适合带有函数类型参数的函数。
这里说的很明白,内联适合将函数作为参数传递的方法。如果你看过一些kotlin源码,会发现一些高阶函数let、map、run都是如此
具体是为什么,我们可以看一个例子:
private fun testFunction(i: Int, call: (Int) -> String) {
call.invoke(i)
}
fun test() {
testFunction(9) {
it.toString()
}
}
复制代码
反编译:
Function1是Kotlin 提供的泛型接口,1 就是说明有一个参数。所以使用lambda表达式实际上每次都是在创建一个FunctionX对象。
然后看一下字节码:
INVOKESTATIC java/lang/Integer.valueOf (I)Ljava/lang/Integer;
INVOKEINTERFACE kotlin/jvm/functions/Function1.invoke (Ljava/lang/Object;)Ljava/lang/Object; (itf)
复制代码
里面有使用Integer.valueOf举行主动装箱。然后对于Function1.invoke(Object) : Object,入参会装箱。如果有返回值又会拆箱。
以上两点都是直接使用lambda表达式所带来的性能损耗。制止这种情况有两个方法:
1.可以将lambda表达式赋值给一个变量,然后每次引用该变量,这样既可以制止重复创建函数对象,也可以制止重复装箱拆箱开销。
2.inline内联函数可以制止高阶函数创建函数对象及装箱拆箱开销,但是要留意inline函数体不宜过大。
下图是给testFunction方法加inline后的反编译代码:
5. Gson剖析
主要问题是gson与data class使用时产生的问题。简单说就是纵然你的变量声明为不可空(不包含基础类型),且有默认值,如果json中的这个字段是null,那么剖析后这个不可空变量也会被赋值为null。这时你在使用这个字段时步伐天然会崩溃。
具体的问题缘故原由以及办理方法可以看下面的几篇博客,写的都很清楚具体,这里就不多说了。
- Android避坑指南,Gson与Kotlin碰撞出一个不安全的操作
- 使用Gson剖析data class引发的一点思考
- Kotlin Json库问题总结(Gson以及Moshi的坑)
这些内容也是我在使用kotlin开发过程中学到和遇到过的,也因此返工了不少之前的代码。。。分享出来也是希望帮你少踩一些坑。
其实还有许多类似文中提到的性能开销,我这里也没法一一枚举出来。所以就必要我们在学习和使用中多关注编译后的代码。
记得很早看过一部动漫叫《钢之炼金术师》,里面的核心就是说:获得某种东西,必要以划一的代价来交换。比如我们使用的许多开源框架都非常简单灵活,但是代价就是作者的封装优化。Kotlin的简便不是没有代价的,里面包含了许多默认的举动,而代价就是一定的性能损耗。如果我们掌握这些细节,扬长避短,或允许以实现“双赢”。
扯多了,哈哈。如果本篇对你有帮助的话,多多点赞支持一下!
6.参考&推荐阅读
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提拔。
必要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
一个人可以走的很快,但一群人才气走的更远!岂论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技能交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
做到真正的技能提拔。**
必要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-Ixb3oJr7-1713305796368)]
一个人可以走的很快,但一群人才气走的更远!岂论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技能交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |