加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹤壁站长网 (https://www.0392zz.cn/)- 分布式云、存储数据、视频终端、媒体处理、内容创作!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

奇怪的知识点

发布时间:2021-03-27 10:32:54 所属栏目:外闻 来源:互联网
导读:下来就会对各种各样的东西感到好奇,好奇的东西多了就发现自己是真的菜。 今天这篇文章写出来的原因,源自一次非常非常诡异的IDE的语法错误提示。 文章是由android的知识引入,但真正想聊的东西是编译原理。所以:才有了标题《奇怪的知识点》。因此各位看官

下来就会对各种各样的东西感到好奇,好奇的东西多了就发现自己是真的菜。

今天这篇文章写出来的原因,源自一次非常非常“诡异的”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引用不是常量,就意味着这种用法是不能工作的:

(编辑:鹤壁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读