【问题标题】:Getters and setters for arrays数组的 getter 和 setter
【发布时间】:2011-10-03 15:44:33
【问题描述】:

我有几个关于数组的 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];
}

对于二传手也是如此。但是,如果我们在每个元素的基础上做事,我们还需要提供一种获取长度的方法:

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

对于这样一个微不足道的任务,这是很多代码,更重要的是,实际使用起来很乱。我们真的必须以这样的方式结束,还是有更好的方法来做到这一点?我到处查看,似乎没有“标准做法”。

【问题讨论】:

    标签: java arrays multidimensional-array getter-setter


    【解决方案1】:

    你认为ArrayList 做了什么,或者之前的Vector

    我认为更好的问题是,为什么在这一点上,您要公开 Foo 完全由数组支持?如果你试图封装它,你不需要到处都有访问器和设置器。如果您只是想在数组周围创建一个类包装器,那么我建议您有一个接口,将其命名为 IntList 或其他名称,并使 Foo 成为列表支持的具体实现。

    【讨论】:

      【解决方案2】:

      关于第一部分,你的 getter 可能不像构造函数吗?

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

      【讨论】:

        【解决方案3】:

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

        就是这样。

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

        【讨论】:

        • 如果数组为空怎么办?不会抛出空指针异常吗?
        • @Brooklyn99 如果数组可以为空,当然迎合它:return array == null ? null : Arrays.copyOf(array, array.length);
        【解决方案4】:

        我为多维泛型数组编写了一个小型 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]
        

        Bohemian 已经写过你只能使用一个维度。在这种情况下,类 PDDAPSeudo internal 也有一个维度。但是 API 为您提供了像多维数组一样的访问权限

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-27
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多