让我们创建一个展示第一个布局以供使用的界面,并为该界面创建一个在内部使用第二个布局的实现。(从代码中删除了访问修饰符。)
interface X {
double getA();
double getB();
double getC();
};
interface ArrayOfX {
X get(int index);
};
class ContiguousArrayOfX implements ArrayOfX {
class ContiguousX implements X {
int index;
ContiguousX(int index) {
this.index = index; }
double getA() { return a[index]; }
double getB() { return b[index]; }
double getC() { return c[index]; }
}
X get(int index) {
return new ContiguousX(index); }
double a[] = new double [SIZE];
double b[] = new double [SIZE];
double c[] = new double [SIZE];
};
如果想减轻 GC 的负担,还可以缓存ContiguousX
. 如果对象完全分配在堆上,这在很大程度上取决于 JIT 编译器的能力ContiguousX
——它们很可能存在于堆栈中,在这种情况下,开销可以忽略不计。作为最后的手段,您可以为快速访问定义一个替代接口:
interface FasterArrayOfX {
double getA(int index);
double getB(int index);
double getC(int index);
};
class FasterContiguousArrayOfX extends ContiguousArrayOfX implements FasterArrayOfX {
// Exercise left to the reader
};
通过针对接口进行编程,您以后始终可以自由选择存储。
为任何给定的类布局编写代码生成器相当简单。上面的代码可以用作样板,只有方法和数组声明取决于您要获取的类布局。我不知道任何现有的工具。