数组的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来访问/修改。如果我们有一个像这样的getter

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];
}

同样适用于setter。但是如果我们以每个元素为基础进行操作,我们还需要提供一种获取长度的方法:

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。这里每个元素都有getter和setter,无论维度是多少

MDDAJ on github

下面是一个例子:创建一个5维字符串数组:
MDDAPseudo<String> c = new MDDAPseudo<String>(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提供了多维数组的访问

相关内容

  • 没有找到相关文章

最新更新