奇怪的知识点
下来就会对各种各样的东西感到好奇,好奇的东西多了就发现自己是真的菜。 今天这篇文章写出来的原因,源自一次非常非常“诡异的”IDE的语法错误提示。 文章是由android的知识引入,但真正想聊的东西是编译原理。所以:才有了标题《奇怪的知识点》。因此各位看官没必要太纠结自己没有学过android或者Java,不影响阅读~ 复现一次语法错误的代码:android知识部分 IDE提示的也很明白:res的id不能在library级别的module中的switch语法中应用。原因是res的id不是常量。 注意:同样的代码在application级别的module中是没有语法问题的。所以对于res的id来说,application中是常量,library中不是常量。如果有同学看过R的内容,就会发现的确如此: 这个是application中的R文件:这个显现引申出一个android打包的知识点:aapt[1]过程中的资源合并[2]。 一句话描述这个知识点:不同module之间的重复的资源会按优先级的进行合并覆盖。这个流程引发的问题,很多老司机都遇到过,资源被覆盖了,我们引用的资源永远会被指向唯一的res。这肯定是不符合预期的。 因此诸如给资源名加前缀的方案便应运而生。 为什么不是final 这里咱们聊一个问题:常量有什么特别之处?下面的代码,编译之后就是能看到常量的特别之处:发现编译器的优化,会把常量直接内联到代码引用之处。那么咱们想想:如果library里的res也是常量会出现什么问题? 常量被内联,一旦发生项目中资源重复,打包过程中就出现覆盖,那么内联的常量已经不能映射到真正的资源上了,毕竟资源已经被覆盖。 也就是会出现:资源找不到的crash 不是final引发的问题
library中的R引用不是常量,就意味着这种用法是不能工作的: (编辑:鹤壁站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |