在Java中,防止在实例方法返回后更改字段

Bob*_*erg 4 java

在我大学的一个软件开发课上,老师一直提到在测验中我们需要确保吸气剂返回的磁场需要"保护".我想她的意思是课外的任何东西都不应该改变它.她没有提供更多的解释.

例如:

class Foo {
    string[] bar = <some array contents>;

    public string[] getBar() {
        return bar;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何调用getBar的代码都可以修改该数组中的元素.你怎么防止这种情况发生?我假设对象本身应该能够修改数组,而不是对象之外的任何东西.

这不是作业帮助,因为测验是几周之久.我只是想更好地理解Java,因为我的老师没有很好地解释.

更新:教师不仅允许我们在场上使用protected作为访问修饰符.

cle*_*tus 8

您可以使用集合并将其包装在Collections.unmodifiable*()中,也可以防御性地复制数组,集合或对象(如果它是可变的(总是哪些数组)).

例如:

class Foo {
    private String[] bar = <some array contents>;

    public String[] getBar() {
        return bar == null ? bar : Arrays.copyOf(bar);
    }
}
Run Code Online (Sandbox Code Playgroud)

您需要注意的是,这是一个浅层副本(克隆版也是如此).不确定你的老师克隆的问题是什么.


Mar*_*ark 5

只是要添加到以前的答案之一,您希望确保使用集合而不是使用clone()方法来实现您在此处尝试实现的目标.这仅创建集合的浅表副本,集合副本中包含的所有对象引用仍指向与原始对象相同的对象,例如,即使原始集合不能,也可以修改集合副本中的对象.如果您正在尝试这样做,请确保您正在复制已归还的集合.