数组的getter和setter

我有几个关于数组的getter和setter的问题。 假设我们有一个这样的类,它在构造函数中创建一个数组的私有副本:

import java.util.Arrays; public class Foo { private int[] array; public Foo(int[] array) { this.array = Arrays.copyOf(array, array.length); } } 

我们希望只通过getter和setter访问/变异数组。 如果我们有一个看起来像这样的吸气剂:

 public int[] getArray() { return array; } 

当我们返回一个允许用户直接修改数组元素的引用时,它会破坏getter的目的。 例如

 Foo foo = new Foo(someArray); ... int[] bar = foo.getArray(); bar[0] = 123; // Now foo.array[0] = 123 and we haven't used a setter! 

所以我们可能需要这样的东西:

 public int getElement(int index) { return array[index]; } 

同样适用于制定者。 但是,如果我们在每个元素的基础上做事,我们还需要提供一种获取长度的方法:

 public int getArrayLength() { return array.length; } 

这对于一维数组来说已经有点乱了,但是我们说我们有一个多维数组:

 import java.util.Arrays; public class Foo { private int[][][] array; public Foo(int[][][] array) { // Code for making a deep copy here } public int getElement(int i, int j, int k) { return array[i][j][k]; } public void setElement(int i, int j, int k, int value) { array[i][j][k] = value; } public int getArrayLength() { return array.length; } public int getArrayLength(int i) { return array[i].length; } public int getArrayLength(int i, int j) { return array[i][j].length; } } 

对于这样一个微不足道的任务来说,这是很多代码,更重要的是实际使用它是一团糟。 我们真的必须得到这样的东西,还是有更好的方法呢? 我到处都看了,似乎没有“标准做法”。

多维数组也是一维数组: int[a][b][c]实际上只是int[a*b*c] ,所以问题归结为,你如何安全地提供访问? 就像这样:

 public class Foo { private int[] array; public Foo(int[] array) { this.array = Arrays.copyOf(array, array.length); } /** @return a copy of the array */ public int[] getArray() { return Arrays.copyOf(array, array.length); } } 

而已。

调用者拥有数组的安全副本,并且可以以完全正常的方式使用数组。 不需要委托方法。

你觉得ArrayList做了什么,或者之前是Vector

我认为更好的问题是,为什么,在这一点上,你是否暴露出Foo完全由数组支持? 如果您正在尝试封装它,则不需要在整个地方都有访问器和设置器。 如果你只是想在数组周围创建一个类包装器,那么我建议你有一个接口,称之为IntList或者其他东西,并使Foo成为一个由列表支持的具体实现。

关于第一部分你的getter看起来不像构造函数吗?

 public int[] getArray() { return Arrays.copyOf(array, array.length); } 

我为多维通用数组编写了一个小API。 在那里你有每个元素的吸气剂,设定者,无论你的尺寸如何。

MDDAJ在github上

这是一个例子:创建一个5维字符串数组:

 MDDAPseudo c = new MDDAPseudo(10,20,5,8,15); c.set("xyz", 0,0,2,1,0); // setter indices: [0][0][2][1][0] String s = c.get(0,0,0,0,0); // getter indices [0][0][0][0][0] 

波希米亚人已经写过,你只能使用一个维度。 在这种情况下,类PDDAPSeudo内部也有一个维度。 但API为您提供了多维数组的访问