Java Arrays:如何确保使用的索引的语义正确性?

时间:2013-04-03 19:04:04

标签: java arrays correctness

我有以下情况:

final int I  = 10;
final int MU = 100;
final int P  = 100;

int[][] a = new int[I][MU];
int[][] b = new int[I][P];

for(int i = 0; i < I; i++) {
  for(int mu = 0; mu < MU; mu++) {
    for(int p = 0; p < P; p++) {
      a[i][mu] = ... // something
      b[i][p]  = ... // something
    }
  }
}

正如您所看到的,我正在使用几个具有相同维度但运行不同索引的数组。在此代码中,以下错误可能会导致ArrayIndexOutOfBoundsException,因为mu的范围大于i

a[mu][i] = ...

原则上,我可以发现这个错误。但是,以下错误更难以捕获:

b[i][mu] = ...

此处不存在运行时异常,因为mup的范围相同。但是,这些错误确实会导致代码中的语义问题。

最后,我的问题是:以这样的方式编程这些数组的最佳方法是只能使用正确的索引(ai来访问数组mu情况)?

谢谢!

1 个答案:

答案 0 :(得分:2)

听起来你真的应该更好地封装你的数据。每当你有两个总是相同大小的集合时,请考虑更改为具有组成它们的某种类型的一个集合。

我们无法确切地告诉你的类型是什么意思(提示:使用更有意义的名字)但是如果你有一个类:

class Foo {
    private final int[] a = new int[MU];
    private final int[] b = new int[P];

    ...
}

然后你可以:

Foo[] foos = new Foo[I];

此时很清楚阵列是如何构造的 - 你不太可能做错事,因为你有一个循环,如:

for (int i = 0; i < foos.length; i++) {
    Foo foo = foo[i];
    // Use foo
}

我也鼓励你使用增强的for循环:

for (Foo foo : foos) {
    ...
}