Java数组:如何确保所用索引的语义正确性?

Java数组:如何确保所用索引的语义正确性?,java,arrays,correctness,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] = ...

我有以下情况:

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
    }
  }
}
原则上,我可以抓住这个错误。但是,以下错误更难捕捉:

b[i][mu] = ...
这里没有运行时异常,因为
mu
的范围与
p
相同。不过,这种错误确实会导致代码中出现语义问题

最后,我的问题是:对这些数组进行编程的最佳方式是什么,使数组
a
只能通过正确的索引访问(
i
mu


谢谢

听起来您真的应该更好地封装数据。任何时候,如果你有两个大小相同的集合,那么就考虑改变一个集合的类型。 我们无法真正确定您的类型要表示什么(提示:使用更有意义的名称),但如果您有一个类:

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
}

1) 不要捕获
阵列索引超出边界异常
。2) 最好的方法是仔细编写和测试代码。首先,让两个单独的最终变量(常量)具有相同的值是没有意义的。同样要回答这个问题,你需要解释你需要三重嵌套的原因。对我来说,有两个双嵌套循环(每个2D数组一个)然后有三个嵌套更有意义。prashant,关于嵌套,你是对的,但这是我的示例中的一个问题,也许我应该将其减少到最小的示例中,并且根本不显示任何循环!这是因为我所考虑的情况,本质上是当您必须使用索引来访问不同的阵列,但可能被错误地用于错误的阵列。谢谢Jon,我同意您的解决方案,尽管它会影响性能吗?我曾经遇到过这样的情况:Java虚拟机在运行时大部分时间都在创建对象(在本例中,我们将为每个
I
创建
Foo
对象)。另一个问题:假设我使用新的
for
语法(
for(Foo-Foo:foos)
)在
for
中的某个点上,我需要
foo
的索引
I
。有没有一个简单的方法可以做到这一点?(我不喜欢做
int I=0;for(Foo-Foo:foos){/*使用I*/I++;}
@Gonzalo:No,如果需要索引,应该使用常规for循环。@Gonzalo:我不相信JVM会创建Foo的新实例;
Foo-Foo
只是指向现有
Foo[I]的引用(想想指针)
object。因此,堆栈上使用了非常小的内存量,但这是短暂的,不会影响GC之类的东西。@Gonzalo:是的,你最终会得到一个容器对象,而不仅仅是数组。但你几乎肯定不应该关注那个微小的细节——这是微观优化,不应该这样做直到它被证明是相关的。
for (int i = 0; i < foos.length; i++) {
    Foo foo = foo[i];
    // Use foo
}
for (Foo foo : foos) {
    ...
}