在我的应用程序中,我只需要一些名字很好的全局值。 首先,我所做的是将它们全部作为“公共静态最终”组件放入一个单独的类中。
然后我意识到我对全局字符串的处理(将它们放入res / strings.xml并通过getString(R.string.string_name)使用它们)也应该使用整数。
然而,我首先发现没有getInteger(R.integer.integer_name)这样的东西,但只有相当冗长的方式:
Resources r = getResources();
int integer = getInteger(R.integer.integer_name);
其次,当我尝试使用switch / case表达式中的值时,我只得到消息“case表达式必须是常量表达式”。
那么使用res / integers.xml有什么意义呢?我正要将我的整数重新放回一些无用的课程......
亲切的问候, 水母
答案 0 :(得分:2)
对于switch / case表达式,我们在case语句中总是需要常量或枚举(< - ENUMS !!)。 switch
参数允许使用变量,但case
参数不得更改。
因此,如果您需要“存储”案例参数和类似名称,请删除integers.xml
(不解决您的问题)以及static final public int
- 实现{{1}而是建模你的全球价值。
等待一些细节提出枚举解决方案;)我们走了:
enum
public enum Value{ VALUE_ONE(300), VALUE_TWO(501), UNKNOWN(-1);
private int value;
private Value(int value) {this.value = value;}
public int getValue() {
return value;
}
public Value findValue(int value) {
for (Value v:values()) {
if (v.value == value)
return v;
}
return Value.UNKNOWN;
}
可用于获取数字值的枚举,如果我们查找未知数字,则findValue
可以替代UNKNOWN
。玩得开心:))
答案 1 :(得分:0)
实际做的是在strings.xml或其他自定义xml文件中创建一组值,并为它们提供描述性名称。这些值在编译时变为静态,每个xml值都是静态的,然后我可以通过它们的id来引用它们。
所以在xml中我做:
<string name="descriptive_name_that_is_easily_read_in_switch_case">
What I put here really doesn't matter</string>
然后在开关/案例中
switch(someValue){
case R.id.descriptive_name_that_is_easily_read_in_switch_case:{
<code>
}
break;
}
这样做的好处是我可以从代码中删除枚举/静态初始化,使其更具可读性,并且仍然可以在整个程序中重用这些值。
有时,您希望仅在某个类或方法中显示您的枚举/静态值。那么这不是你要做的。