很抱歉出现菜鸟问题。传递引用与值(value)很难!

所以我有一类具有很大的数据结构的多维数组。我需要从另一个类访问这些数组。我可以只公开数组并执行经典的objectWithStructures.structureOne。或者,我可以做 setter/getter :添加诸如public int [] [] [] getStructureOne()之类的方法。

拥有 setter/getter 是否可以复制多维数组?还是它通过引用传递了它,而您只是不能更改引用的对象?

我担心内存和性能。但是,将数据结构公开,虽然如果不导致制作副本会更快,但似乎是不好的编码习惯。

附录:因此,当我使用getter方法返回对某个对象(例如数组)的引用时,使用getter方法的任何人都可以编辑该对象吗?还是以某种方式“锁定”进行编辑,以便只有其所在的类才能更改该对象?

最佳答案

实际上,在Java中,从技术上讲,所有内容都是按值传递,因为引用是内存地址的值,但是您可以将其视为按引用传递。

至于性能,我怀疑是否存在可测量的差异,因为JVM JIT编译器可能会内联访问器方法(“getter”)。就样式而言,最好使用getter优先于公开您的字段。

至于安全发布(允许安全访问私有(private)数据)-不,对象不是“锁定在只读模式”;它是完全可编辑的,因为数组是可变的。

为了安全地允许访问数据数组,您基本上有两种选择:

  • 从您的getter返回数组的副本-昂贵的
  • 提供了一个可在给定位置返回元素的API-易于编写代码,但以后可能很难更改数组尺寸,因为该API已为您的
  • 类定义

    提供API的示例可能是:
    public int getStructureOne(int x, int y, int z) {
        return structureOne[x][y][z];
    }
    

    该方法是完全安全的,因为基元(如int)是通过值传递的-调用者更改此方法的结果所分配到的变量的值,数组不会发生任何变化。

    关于java - Java:getter方法与公共(public)实例变量:性能和内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12468813/

    10-13 23:58