android官方技术文档翻译——Case 标签中的常量字段

本文译自androd官方技术文档《Non-constant Fields in Case Labels》,原文地址:http://tools.android.com/tips/non-constant-fields。

本文地址:http://blog.csdn.net/maosidiaoxian/article/details/41574853。转载请注明出处。翻译如有错讹,敬请指正。

Case 标签中的常量字段

在正常的 Android 项目中,资源R类里的常量是这样声明的:

public static final int main=0x7f030004;

然而,到 ADT 14为止,在类库项目中,他们会被这样声明:

public static int main=0x7f030004;

换句话说,在库项目中这些常量都不是final的。原因很简单:当多个库项目整合时,字段的实际值(必须是唯一的)可能会出现碰撞。在ADT 14 之前,所有这样的字段都是final的,所以导致所有的库被使用的时候,主项目必须编译他们的所有资源和相关 Java 代码。这样的性能是很差的,因为它使构建的速度非常慢。它还阻碍了不包含源代码的库项目的分发,限制库项目的使用范围。

字段不再是 final 的原因是意味着库jar包可以只编译一次,并且能直接在其他项目中复用。以及允许分发库项目的二进制版本(将在 r15出现),这使得构建更快

然而,它对库的源码也有一个影响。以下形式的代码将不再能够编译:

int id = view.getId();

switch (id) {

case R.id.button1:

        action1();

        break;

    case R.id.button2:

        action2();

        break;

    case R.id.button3:

        action3();

        break;

}

这是因为switch语句需要所有case的标签,如R.id.button1,在编译时是个常量 (这样值可以直接复制到.class 文件中)。

为此解决方案很简单: 将 switch 语句转换成 if-else 语句。幸运的是,这在 Eclipse 中操作起来很简单。只需要将插入符号放在switch关键字上,并按 Ctrl+1 (在Mac上是 Cmd+1):

在上述场景中,它将把switch语句转换成如下:

int id = view.getId();

if (id == R.id.button1) {

action1();

} else if (id == R.id.button2) {

action2();

} else if (id == R.id.button3) {

action3();

}

这通常是在 UI 代码中,并且它对性能的影响可以忽略不计。

我们有一个检测器,可以发现这些错误 (引用R字段的非常量 case 标签),并提供问题的简要说明 (并指向此页面以获取详细信息。)

有关自动检测的详细信息

P.S. 如果你的 switch 语句如下所示:

switch (view.getId()) {

那么结果会转换成每一个if检查都重复调用 view.getId() 的效率低下的if/else链。你需要先提取此表达式 (使用“提取本地变量(Extract Local Variable)”的重构快捷键键),然后再转换这条 switch 语句。

时间: 2024-10-06 09:29:18

android官方技术文档翻译——Case 标签中的常量字段的相关文章

Android官方技术文档翻译——Gradle 插件用户指南(4)

近期赶项目,白天基本没时间,仅仅有晚上在家的时候才干看一看.昨天晚上仅仅翻译完了第四章,今天就仅仅发第四章吧. 本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易.转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/4195580

Android官方技术文档翻译——Gradle 插件用户指南(6)

没想到翻译这篇<Gradle 插件用户指南>拖了差不多一个月,还跨年了.不好还好,在2号时终于一口气把剩下的给翻译完了(其实那天剩下的也就不到一章). 今天先发一下第六章,明天再发第七章. 本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易,转载请注明CSDN博客上的出处: http://blog.c

Android官方技术文档翻译——Gradle 插件用户指南(7)

本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易,转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/42417779 前三章见<Android官方技术文档翻译--Gradle 插件用户指南(1-3)>. 第四章见&

Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本

本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0. 本篇文档介绍的是低版本的Gradle项目怎么升级到1.0.0版本. 翻译不易,转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/427

Android官方技术文档翻译——IntelliJ 项目迁移

本文译自Android官方技术文档<Migrating from IntelliJ Projects>,原文地址:http://tools.android.com/tech-docs/new-build-system/migrating-from-intellij-projects. 上一篇介绍了如何上一篇介绍了如何把一个Eclipse上的Android项目迁移到 Android Studio,这一篇继续介绍对 IntelliJ项目的迁移. 翻译不易,转载请注明CSDN博客上的出处: http

Android官方技术文档翻译——清单合并

本文译自Android官方技术文档<Manifest Merger>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger. 翻译不易,转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/42671999 翻译工作耗时费神,如果你觉得本文翻译得还OK,请点击文末的"顶":如有错讹

Android官方技术文档翻译——新构建系统概述

本文译自Android官方技术文档<New Build System>,原文地址:http://tools.android.com/tech-docs/new-build-system. 这篇文章从去年就开始翻译的了,无奈项目较赶我翻译的速度又慢,翻译期间Google官网又对它不断更新,以致拖到了现在.这一篇文档是对Android新构建系统的概述,列出了与它相关的一些文档,以及这个新构建系统的各版本更新日志.这个新的构建系统,其实也就是这个Gradle 上的 Android 插件,如果你的An

Android官方技术文档翻译——Gradle 插件用户指南(1-3)

不知道是什么网络问题,上午一直发不了博客,其它页面基本正常,就是在写博客这里,每次打开都是响应超时.刚才用了VPN,顺便试了一下,竟然能够编辑.想是CDN之类的问题吧. 这次翻译的是Gradle 插件用户指南,也就是Gradle上的Android插件的官方文档.文档非常长,加上近期激情不够,翻译得有些慢.到昨天为止,才译到第四章.今天先发前三章. 本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/

Android官方技术文档翻译——开发工具的构建概述

本文译自Android官方技术文档<Build Overview>,原文地址:http://tools.android.com/build. 因为<Android Lint Checks>这篇太长了,没译完,所以这次就发一下<Build Overview>的翻译好了. 这一篇是对Android 的开发工具进行构建的概述,比如Android Studio,Android Gradle 插件,SDK和ADT等. 翻译不易,转载请注明CSDN博客上的出处: http://bl