版权声明:java
本帐号发布文章均来自公众号,承香墨影(cxmyDev),版权归承香墨影全部。android
未经容许,不得转载。模块化
由于业务须要,须要把手上一个项目,按模块拆分出来,进行模块化处理,来适应不一样的版本需求。大体的流程就是按模块化的思想,将各个业务进行拆分,总之就是一堆解耦的操做。模块化的好处有不少,这里就不一一说明了。设计
肯定好须要拆分的模块以后,其实具体业务代码都是现成的,只是须要制定好接口,而后"有技巧"的复制现有代码到各个该在的模块内就能够了。在这个过程当中,碰到一些问题,在一些原有代码中,使用 switch-case 操做一些 IDs 的资源的时候,本来是没有问题的,可是当它被复制到 Android Library 中的时候,就开始提示错误了,表示没法这样使用,下面就这个问题来进行一个简单的讲解,并提供一个快速解决的方法。3d
咱们先来看看报错信息。code
那么是什么致使出现这样的问题呢?cdn
咱们知道,switch 语句的 case 操做必须是一个常量。而在 App Module 中,IDs 自己在 R.java 中就是被定义为一个一个常量而存在的,那么在 Android Library 中,这一点是否会有变化呢?blog
先来看看 App 的 R.java。接口
而官方其实也有资料来讲明这个问题。ip
tools.android.com/tips/non-co…
有兴趣的能够直接阅读原文,大体的意思是在 SDK Tools r14 开始,在 Library Module 中,会将 IDs 的资源,声明为 static 而非 static final 。
而这么设计的缘由是,在多个 Module 组合的项目中,若是须要确保每一个 Module 中的 IDs 资源的值在整个项目中都是惟一的话,就须要每次编译的时候都将全部的资源和相关的 Java 代码与主项目一块儿从新编译,为每一个 IDs 的资源,都生成一个惟一的值,这样就会影响构建的效率。同时它也限制了发布 Android Library 就必须发布源码,从而限制了 Android Library 的使用范围。因此在 SDK Tools r14 开始,就将 Android Library 中的 IDs 标记为非 final 类型的。
而官方也提供了解决方案,就是使用 if-else 语句替换 switch-case 语句。若是咱们是从零开始编写逻辑,直接使用 if-esle 来编写这种逻辑便可,可是咱们是在 copy 一个现有的项目,那么问题就变成了,如何快速的将 switch-case 替换为 if-else 语句。
在 Android Studio 中,是提供了快捷键来一键替换的。若是没有修改过,在 Mac 中,快捷键是 command + return
,在 Windows 中,快捷键是 Alt + Enter
。
自己这样的一件事情,根据 提示就解决了,可是做为开发者,不该该只是知足解决问题,应该从更深层次的来探讨问题的缘由,为何如此设计,如何快速的解决这个问题。