问题 数组的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;
    }
}

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


6159
2017-07-12 13:44


起源

你看过名单了吗? - Jacob
阵列是如此1900年代。 - Marcelo


答案:


多维数组也是一维数组: 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);
    }
}

而已。

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


8
2017-07-12 13:50





你怎么看 ArrayList 是,或 Vector 在它之前?

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


1
2017-07-12 13:46





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

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

1
2017-07-12 13:46





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

MDDAJ在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为您提供了多维数组的访问


0
2017-07-13 00:30