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 时的做法。