Java:getter方法与公共实例变量:性能和内存

Java:getter方法与公共实例变量:性能和内存,java,performance,memory-management,Java,Performance,Memory Management,对不起,我没有回答你的问题。通过引用和值传递是很难的 所以我有一个拥有相当大数据结构的类——多维数组。我需要从另一个类访问这些数组。我可以将数组公开,然后使用structures.structureOne执行经典的objectWithStructures。或者,我可以做getter:添加像public int[][]getStructureOne()这样的方法 让getter复制多维数组吗?或者它是通过引用传递的,而您只是不能更改引用的对象 我担心记忆力和表现。但是,公开数据结构,如果不导致复制

对不起,我没有回答你的问题。通过引用和值传递是很难的

所以我有一个拥有相当大数据结构的类——多维数组。我需要从另一个类访问这些数组。我可以将数组公开,然后使用structures.structureOne执行经典的objectWithStructures。或者,我可以做getter:添加像public int[][]getStructureOne()这样的方法

让getter复制多维数组吗?或者它是通过引用传递的,而您只是不能更改引用的对象

我担心记忆力和表现。但是,公开数据结构,如果不导致复制,则速度更快,这似乎是糟糕的编码实践

附录:那么,当我使用getter方法返回对对象(例如数组)的引用时,使用getter方法的人是否可以编辑该对象?或者,它是否以某种方式被“锁定”进行编辑,以便只有它所在的类才能更改该对象?

所有内容都是按值传递的,但getter将返回对数组的引用,而不涉及副本

任何修改该数组的人都会看到该数组的引用

至于表现,唯一知道的方法就是基准测试。get方法会增加开销,但是如果您的结构很大,那么对结构中元素的任何访问都会使添加的方法调用的开销相形见绌


至于糟糕的编码实践,这实际上取决于你在做什么。您的代码是否需要确保其他人无法修改?然后返回一份副本。或者更好的方法是,强制调用方请求一个数据范围,只返回他们所需范围的副本。

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

至于性能,我怀疑是否存在可测量的差异,因为JVM JIT编译器可能会在线访问器方法(“getter”)。作为一种风格,人们认为最好使用getter,而不是将字段公开

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

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

  • 从getter返回数组的副本-昂贵
  • 提供一个在给定位置返回元素的API—代码编写简单,但以后可能更难更改数组维度,因为该API是为类定义的
  • 提供API的一个示例可能是:

    public int getStructureOne(int x, int y, int z) {
        return structureOne[x][y][z];
    }
    
    此方法是完全安全的,因为原语(如
    int
    )是按值传递的-如果调用者更改此方法的结果分配到的变量的值,则数组不会发生任何变化

    通过引用和值传递是很困难的

    在Java中,一切都是通过值传递的。基本类型通过其值传递,复杂类型通过其引用的值传递。数组不是基元,因此它们的引用是传递的

    我可以把阵列公之于众。。。或者,我可以做一个getter

    如果它们是
    public
    ,则其他类可以更改对象自身包含的数组引用。如果有返回数组引用的getter,那么调用方可以更改数组的内容。两者都很糟糕。这也回答了你的补遗问题

    我认为有以下几种选择:

    • 按照@Bohemian的建议,对单个细胞使用吸气剂。如果需要对数组对象进行任何锁定,则此处可能有其他选项

    • 返回对数组的引用,并相信调用者不会弄糟它。额外的CHEKC可以通过在编译时检查访问来实现

    • 在对象内保留两个数组副本。一个是返回的getter,另一个是真正的工作。您可以记录更改数组没有效果,并在从getter返回时断言它们的内容相同


      • Java按值传递所有内容。Java引用是按值传递的指针。

        据我所知,纯简单的getter在运行时由JIT内联,避免了开销。可能是这样,但取决于设置,JIT可能会在以后启动,或者您可能会在getter中做更多的工作,等等。所以您不想依赖它。因此需要进行基准测试。Java中的一切都是按值传递的!Getter正在向对象返回引用(或句柄,只是为了避免混淆术语)的副本。是:如果Getter返回对对象的引用(即任何非原语的对象),则使用Getter的任何人都可以编辑该对象。