-1

我是 Java 的新手,我对在 Java 中返回一个数组感到困惑。以下是我的代码:

public class Pointer{
    private final int[] data;
    Pointer(){
        data = new int[4];
        data[0] = 1;
        data[1] = 2;
        data[2] = 3;
        data[3] = 4;
    }
    public int[] test(){
        return data;
    }
    public void print(){
        int length = data.length;
        int j;
        for(j = 0; j < length; j++){
            System.out.println(data[j]);
        }
    }
    static public void main(String[] argv){
        Pointer i = new Pointer();
        int[] re = i.test();
        i.print();
        re[2] = 1;
        i.print();
    }
}

虽然我返回了一个 int 数组,而不是指向它的指针,所以当我写 re[2] = 1 时不应更改数据。如何使这个指针对象不可变?

4

3 回答 3

3

首先,看一下Josh Bloch 的优秀书籍Effective Java中不可变类章节的文档。我知道该网站看起来像是 1997 年制作的,但不要让这打扰您。资料很好。

为了使您的类是不可变的,您不能在可变的私有数据上允许mutator 方法(即setter)或访问器(即getter)。这否定了private-ness 并创建了一个泄漏的抽象。

您发现了后者的一个实例。您通过 getter 公开的数组是可变的。这使您的类可变。没有办法使数组不可变。

你有选择。这里有一些:

  • 在您的 getter 中,返回类中数组的副本。
  • 没有getter,但允许类似的东西getValue(int index)在给定索引处检索数组值(IllegalArgumentException如果索引超出范围,则进行错误处理)。
  • 在您的 getter 中,返回一个从数组构造的不可变集合,例如Collections.unmodifiableList(Arrays.asList(data));. 有关文档,请参见此处
于 2013-10-27T03:02:57.493 回答
0

数组是 Java 中的对象,对象是通过引用传递的(即使引用是通过值传递的)。

您不能按值传递数组本身。

您可以做的是返回数组的副本。这种方式对返回数组的更改不会影响内部的内部数组Pointer(如果这是您想要的行为)。

public int[] test(){
    return data.clone();
}
于 2013-10-27T03:00:00.433 回答
0

返回数组安全的唯一情况是数组为空。否则我们需要返回一份。有 2 种方法可以复制 1) arr.clone() 2) Arrays.copyOf()

于 2013-10-27T03:11:17.700 回答