JVM究竟如何编译三元运算符?我应该关注不同的api版本吗?

 arliejun 发布于 2023-01-30 14:51

所以,让我说我有这段代码:

int mode = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB ? AudioManager.MODE_IN_COMMUNICATION : AudioManager.MODE_IN_CALL;

现在,假设我在一些预姜饼的设备上运行此代码.

是否存在无法获得静态导入的AudioManager.MODE_IN_COMMUNICATION情况?

我的意思是,是否有任何情况下,我会看到一个崩溃,因为在MODE_IN_COMMUNICATION姜饼被检查之前是不可用的?

三元运算符如何用Java编译?它是否将这两个东西编译为整数?它是否在编译期间扩展代码?

1 个回答
  • 一个static final是在编译时已知的"变量"被编译成在某些情况下你的代码.(例如int编译器知道最终值的每一个)

    所以你的代码实际上就是这样

    int mode = android.os.Build.VERSION.SDK_INT >= 11 ? 3 : 2;
    

    任何版本都可以运行.它没有对Android设备上可能存在或不存在的常量进行任何引用.

    技术细节可以在Java语言规范中找到,例如§13.1

    对作为常量变量的字段(第4.12.4节)的引用在编译时被解析为表示的常量值.二进制文件中的代码中不应存在对此类字段的引用

    您可以从文档中看到某些内容是否为常量值.

    Build.VERSION_CODES.HONEYCOMB "常数值:11"

    AudioManager.MODE_IN_COMMUNICATION "常数值:3"

    AudioManager.MODE_IN_CALL "常数值:2"

    Build.VERSION.SDK_INT本身是一个static final int但在编译时没有内联.文档没有说明常量值

    Build.VERSION.SDK_INT

    它被实现为

    public static final int SDK_INT = SystemProperties.getInt("ro.build.version.sdk", 0);
    

    并且编译无法确定SystemProperties.getInt将返回什么,因此该值是唯一实际引用设备中的值的值.

    2023-01-30 14:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有