在访问器方法中复制对象

时间:2016-01-19 16:31:16

标签: java object

如果返回存储在字段中的存取方法中的对象,则基于 你决定是否返回该对象的副本?

3 个答案:

答案 0 :(得分:2)

如果对象是 immutable ,您通常可以在不进行复制的情况下返回此对象。除此之外,我会考虑:

  1. 我退回的客户。我是否将它专门归还给我理解/信任的客户,以便我知道他们将如何使用这个对象?如果是这样,我可能不会复制
  2. 制作副本有多贵?如果它是微不足道的,我可以默认制作副本。
  3. Am 可能会更改此对象,并返回对客户端的引用?如果是这样我会复制一份
  4. 没有硬性解决方案。它由许多标准决定。如果我构建了一组交互程度很高并且这些交互被理解且不太可能扩展的对象,那么我倾向于默认不复制。如果我将对象提供给我不了解的用户,或者为将来长期使用创建API,那么我会默认复制。

    如果您有可变的对象,但您不希望客户端更改,您还可以通过您返回这些对象的接口来限制客户端与这些对象的交互方式(例如,返回它们) - 只有这个对象的接口)。如果你在掩护下改变那个对象,它就不会帮助他们,但它会阻止他们通过你给他们的参考来改变一个对象。如果该对象在幕后不会发生变化,那么与不断制作副本相比,它的工作量就会减少。

答案 1 :(得分:1)

在Java中,访问器(public Object getField();)始终返回指向字段本身的指针。它不会复制任何对象,该对象在内存中只存在一次,并且该方法只返回指向它的指针。

答案 2 :(得分:1)

如果您不希望任何人对可变对象进行更改,请返回该对象的副本。但是如果这个对象是不可变的,比如Class Font,Color ..的实例,或者像int这样的基本类型,double ..客户端无法对此引用进行任何更改