所以,让我说我有这段代码:
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编译?它是否将这两个东西编译为整数?它是否在编译期间扩展代码?
一个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
将返回什么,因此该值是唯一实际引用设备中的值的值.