在Java中,有没有办法遍历变量列表
(例如Avg1,Avg2,Avg3)将数字替换为变量?
我不能使用数组,因为它们不能在 Tridium 环境中使用。
我需要这样的东西:
for (i=1;i<10;i++) {
getAvg(i).setValue(5);
}
我必须使用以下格式来设置值:
getVarName().setValue(value);
其中 VarName = 变量的名称,以大写字母开头,value = 设置变量的值。
在Java中,有没有办法遍历变量列表
(例如Avg1,Avg2,Avg3)将数字替换为变量?
我不能使用数组,因为它们不能在 Tridium 环境中使用。
我需要这样的东西:
for (i=1;i<10;i++) {
getAvg(i).setValue(5);
}
我必须使用以下格式来设置值:
getVarName().setValue(value);
其中 VarName = 变量的名称,以大写字母开头,value = 设置变量的值。
我终于想出了如何做我需要的。
for (int i=1; i <= incount; i++) {
String ord = getString("BqlOrd" + i);
Bnum = (BStatusNumeric)get("Num"+i);
Bavg = (BStatusNumeric)get("Avg"+i);
Bmin = (BStatusNumeric)get("Min"+i);
Bmax = (BStatusNumeric)get("Max"+i);
Bdefault = (BStatusNumeric)get("Default"+i);
}
这有效地迭代了 Tridium 程序中的“槽”,这些程序属于 BStatusNumeric 类。
Java 在运行时不提供对局部变量的任何类型的反射,所以如果我理解正确,你不能做你所问的。如果您要迭代的是类的数据成员(实例字段),则可以使用反射来完成,但不能使用局部变量,这很可能完全由编译器优化。
如果可以使用属性而不是局部变量,则可以使用反射。也就是说,如果环境不支持数组,我怀疑它是否支持反射。
我对 Tridium 环境知之甚少,但我假设 Collections 框架也是不可能的......
尝试使用enum
并实现java.util.Enumeration
. 如果你没有,请从中汲取灵感。
public enum Foo implements java.util.Enumeration {
AVG1, AVG2, AVG3, AVG4, AVG5;
private Foo currentOption;
public boolean hasMoreElements() {
if (currentOption!=AVG5) return true;
else return false;
}
public Object nextElement(){
switch (currentOption) {
case AVG1: currentOption=AVG2; return AVG2;
case AVG2: currentOption=AVG3; return AVG3;
case AVG3: currentOption=AVG4; return AVG4;
case AVG4: currentOption=AVG5; return AVG5;
default: return null;
}
}
}
代码质量不是很好,但你明白了。