HTML以ID为参数的switch,关于R.id.XX是否可以作为Case的键值?

在将一个项目移植到框架时遇到问题,原项目使用switch(id)语句,其中case为R.id.XX,但在框架中报错,提示case键必须使用常量。原因是ADT 14之后库项目中的R类常量不再为final,导致switch语句无法编译。解决方案是将switch转换为if-else结构,或者确保case值在编译时为常量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移植一个项目到框架中,原项目代码中使用:

swich(id)

case R.id.XX:break;

case R.id.XX:break;

代码不报错,但我移植到我的Frame框架中(Frame框架是作为库存在的)报错,提示case键必须使用常量。

开始想不明白,为什么两个项目中会有如此区别呢?后来看了一篇博客,才恍然大悟。

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,在编译时是个常量

<think>嗯,用户这次明确询问Java中switch-case的语法规则,特别是多个case能否使用同一个值。看来用户正在学习或使用Java时遇到了具体问题。从技术实现角度,Java的switch语句确实不支持case标签重复,这与其他语言如C或JavaScript不同。用户可能是从其他语言转来学习Java,或者在网上看到不同语言的示例产生了混淆。需要强调几个关键点:编译期检查的严格性、枚举类型的特殊处理、新版本中switch表达式的改变。用户没有指定Java版本,但考虑到现在主流用Java8及以上,应该覆盖传统和新语法两种情况。注意到用户上次询问过快速排序,这次突然切到Java语法,可能是不同学习阶段的提问。不过技术细节类问题最好保持简洁准确,避免过度延伸。需要警告用户重复case会直接导致编译失败,这在实际开发中容易引发团队协作问题,特别是多人修改同一文件时。可以补充建议用fall-through或模式匹配作为替代方案。要不要提到其他语言的处理方式做对比呢?暂时不必,用户的问题非常聚焦Java,而且上次回答后也没有追问其他语言特性。保持专注更高效。</think> 在 Java 中,**多个 `case` 标签不能使用相同的常量值**,否则会导致编译错误。以下是详细规则和示例: --- ### **Java `switch-case` 核心规则** 1. **值唯一性要求** - 每个 `case` 后的常量值必须在 `switch` 语句中**唯一**。 - 违反示例: ```java switch (value) { case 1: ... break; case 1: ... break; // 编译错误:值重复 case 2: ... } ``` 2. **类型限制** `case` 标签支持的类型包括: - 基本类型:`byte`、`short`、`char`、`int` - 引用类型:`String` (Java 7+)、枚举类型(Java 5+) - 包装类型:`Byte`、`Short`、`Character`、`Integer` **不支持**:`long`、`float`、`double`、`boolean`。 3. **`default` 分支** 可选分支,用于处理未匹配的输入值,位置不限(建议放末尾)。 --- ### **替代方案:合并操作逻辑** 若需对多个值执行相同操作,可通过 **`case` 穿透(Fall-through)** 实现: ```java switch (day) { case 1: // 周一 case 2: // 周二 case 3: // 周三 System.out.println("工作日"); // 值为1/2/3均执行此处 break; case 4: System.out.println("周四"); break; default: System.out.println("周末"); } ``` --- ### **新版特性(Java 14+)** 支持箭头语法(`->`)简化代码,**天然避免穿透**: ```java switch (day) { case 1, 2, 3 -> System.out.println("工作日"); // 多值合并 case 4 -> System.out.println("周四"); default -> System.out.println("周末"); } ``` --- ### **总结** | **行为** | **传统语法** | **新语法 (Java 14+)** | |-------------------|--------------|---------------------| | 多个 `case` 同值 | ❌ 编译错误 | ❌ 编译错误 | | 多值共享相同操作 | ✅ 用穿透实现 | ✅ `case A,B,C ->` | > **提示**:使用 `-Xlint:fallthrough` 编译选项可检查意外的穿透行为[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值