Java - 在发送到方法之前递增变量
Java - Incrementing a variable before sending to the method
情况
好吧,此方法正在管理一个接受列表作为参数的转换,但肯定看起来 可扩展。
List<Long> array_list_data= new ArrayList<>();
public void get_Data() {
long0 = array_list_data.get(0);
long1= array_list_data.get(1);
long2= array_list_data.get(2);
}
之后,它将使用 long
字段创建一个不同的 class。
问题
但是,如果我们必须将此数据扩展到此列表中的 100 个参数怎么办?
到目前为止我所做的是:
List<Long> array_list_data= new ArrayList<>();
public void get_Data() {
int k = 0;
long0= array_list_data.get(k);
long1= array_list_data.get(k++);
long2= array_list_data.get(k++);
}
为什么递增 k
不是正确的方法?
它工作正常,只是 k++
先做 return k,然后将它加一,所以你得到 k、k、k+1、k+2 等。使用 ++k
代替。或者在第一次调用时也使用 k++
,您可以选择。
k++
将 return k
的值然后递增。
++k
将递增 k
然后 return 递增的值。
您应该根据自己的情况使用 ++k
。
k++
执行 post-增量。也就是说,表达式的值是k
的原始值,然后k
递增。它在调用方法之前仍然递增,但作为参数传递的值是递增发生之前的值。换句话说,调用:
x = list.get(k++);
相当于:
int tmp = k;
k = k + 1;
x = list.get(tmp);
所以如果你真的有:
memory_version = array_list_data.get(k++); // Calls with 0, then k=1
mains_voltage_min = array_list_data.get(k++); // Calls with 1, then k=2
mains_voltage_max = array_list_data.get(k++); // Calls with 2, then k=3
那就可以了,相当于你的第一个代码。你目前的问题是你实际上有:
memory_version = array_list_data.get(k); // Calls with 0, then k=0
mains_voltage_min = array_list_data.get(k++); // Calls with 0, then k=1
mains_voltage_max = array_list_data.get(k++); // Calls with 1, then k=2
但是,我建议如果您在 class 中使用集合作为字段对数据 进行建模,您最好使用每个值的单独字段。 (当然,您可以通过从列表中提取数据来创建 class 的 实例 ,但这是另一回事。)
尽管您的方法在 ++
位置上进行一些调整后效果很好,但是对于 100 个字段,您可能会更好地进行反射。将字段名称放入数组或列表中,然后在循环中一个一个地遍历它们,并根据循环变量设置值:
String[] fieldNames = new String[] {"memory_version", " mains_voltage_min", ...};
...
Class<MyClass> c = MyClass.class;
for (int i = 0 ; i != fieldNames.length ; i++) {
Field f = c.getDeclaredField(fieldNames[i]);
f.setLong(this, array_list_data.get(i));
}
这会将您的列表处理代码减少到几行简单的代码,并且让您只需按正确的顺序排列 fieldNames
数组即可更改 array_list_data
中字段的顺序。
为了管理可伸缩性,我会使用枚举和映射:
enum Var {
MEMORY_VERSION(0),
MAINS_VOLTAGE_MIN(1),
MAINS_VOLTAGE_MAX(2);
private Integer value;
Var(Integer value) {
this.value = value;
}
public Integer value() { return value; }
}
List<Long> array_list_data= new ArrayList<>();
Map<Integer, Long> variables = new HashMap<>();
public void getData() {
for (int j=0; j<array_list_data.size(); j++) {
variables.put(j, array_list_data.get(j));
}
}
public void test() {
System.out.println("Memory version: " + variables.get(Var.MEMORY_VERSION.value()));
}
以便您可以根据需要添加任意数量的变量,并且可以使用有意义的名称进行检索,例如在 test() 方法中。
你根本不需要维护索引变量;这就是为什么我们有迭代器:
final Iterator<Integer> iterator = array_list_data.iterator();
memory_version = iterator.next();
mains_voltage_min = iterator.next();
mains_voltage_max = iterator.next();
关于递增部分,试试这个:
public void getData() {
int i = 0;
// get element 0, then increment i
memory_version = array_list_data.get(i++);
// get element 1, then increment i
mains_voltage_min = array_list_data.get(i++);
// get element 2, then increment i
mains_voltage_max = array_list_data.get(i++);
}
这就是我在使用 JDBC ResultSet 时的做法。
情况
好吧,此方法正在管理一个接受列表作为参数的转换,但肯定看起来 可扩展。
List<Long> array_list_data= new ArrayList<>();
public void get_Data() {
long0 = array_list_data.get(0);
long1= array_list_data.get(1);
long2= array_list_data.get(2);
}
之后,它将使用 long
字段创建一个不同的 class。
问题
但是,如果我们必须将此数据扩展到此列表中的 100 个参数怎么办?
到目前为止我所做的是:
List<Long> array_list_data= new ArrayList<>();
public void get_Data() {
int k = 0;
long0= array_list_data.get(k);
long1= array_list_data.get(k++);
long2= array_list_data.get(k++);
}
为什么递增 k
不是正确的方法?
它工作正常,只是 k++
先做 return k,然后将它加一,所以你得到 k、k、k+1、k+2 等。使用 ++k
代替。或者在第一次调用时也使用 k++
,您可以选择。
k++
将 return k
的值然后递增。
++k
将递增 k
然后 return 递增的值。
您应该根据自己的情况使用 ++k
。
k++
执行 post-增量。也就是说,表达式的值是k
的原始值,然后k
递增。它在调用方法之前仍然递增,但作为参数传递的值是递增发生之前的值。换句话说,调用:
x = list.get(k++);
相当于:
int tmp = k;
k = k + 1;
x = list.get(tmp);
所以如果你真的有:
memory_version = array_list_data.get(k++); // Calls with 0, then k=1
mains_voltage_min = array_list_data.get(k++); // Calls with 1, then k=2
mains_voltage_max = array_list_data.get(k++); // Calls with 2, then k=3
那就可以了,相当于你的第一个代码。你目前的问题是你实际上有:
memory_version = array_list_data.get(k); // Calls with 0, then k=0
mains_voltage_min = array_list_data.get(k++); // Calls with 0, then k=1
mains_voltage_max = array_list_data.get(k++); // Calls with 1, then k=2
但是,我建议如果您在 class 中使用集合作为字段对数据 进行建模,您最好使用每个值的单独字段。 (当然,您可以通过从列表中提取数据来创建 class 的 实例 ,但这是另一回事。)
尽管您的方法在 ++
位置上进行一些调整后效果很好,但是对于 100 个字段,您可能会更好地进行反射。将字段名称放入数组或列表中,然后在循环中一个一个地遍历它们,并根据循环变量设置值:
String[] fieldNames = new String[] {"memory_version", " mains_voltage_min", ...};
...
Class<MyClass> c = MyClass.class;
for (int i = 0 ; i != fieldNames.length ; i++) {
Field f = c.getDeclaredField(fieldNames[i]);
f.setLong(this, array_list_data.get(i));
}
这会将您的列表处理代码减少到几行简单的代码,并且让您只需按正确的顺序排列 fieldNames
数组即可更改 array_list_data
中字段的顺序。
为了管理可伸缩性,我会使用枚举和映射:
enum Var {
MEMORY_VERSION(0),
MAINS_VOLTAGE_MIN(1),
MAINS_VOLTAGE_MAX(2);
private Integer value;
Var(Integer value) {
this.value = value;
}
public Integer value() { return value; }
}
List<Long> array_list_data= new ArrayList<>();
Map<Integer, Long> variables = new HashMap<>();
public void getData() {
for (int j=0; j<array_list_data.size(); j++) {
variables.put(j, array_list_data.get(j));
}
}
public void test() {
System.out.println("Memory version: " + variables.get(Var.MEMORY_VERSION.value()));
}
以便您可以根据需要添加任意数量的变量,并且可以使用有意义的名称进行检索,例如在 test() 方法中。
你根本不需要维护索引变量;这就是为什么我们有迭代器:
final Iterator<Integer> iterator = array_list_data.iterator();
memory_version = iterator.next();
mains_voltage_min = iterator.next();
mains_voltage_max = iterator.next();
关于递增部分,试试这个:
public void getData() {
int i = 0;
// get element 0, then increment i
memory_version = array_list_data.get(i++);
// get element 1, then increment i
mains_voltage_min = array_list_data.get(i++);
// get element 2, then increment i
mains_voltage_max = array_list_data.get(i++);
}
这就是我在使用 JDBC ResultSet 时的做法。