在Java中与不可变对象共享内部是什么意思?

bla*_*her 8 java oop

我一直在阅读Effective Java,我发现这样的声明不仅可以共享不可变对象,还可以共享它们的内部结构.但是,我正在努力弄清楚这是什么意思,一个例子肯定会有所帮助,因为书中没有给出任何例子.我已经知道无法更改不可变对象,例如a String.

NIN*_*OOP 9

进一步阅读本书:

BigInteger类使用符号-幅度表示内部.符号由a表示,int幅度由int数组表示.该negate方法产生一个BigInteger类似幅度和相反符号的新.它不需要复制数组; 新创建的BigInteger指向与原始内核相同的内部数组.


gre*_*gor 6

例如,如果你有一个班级

public class Vector2d { 
  private final BigDecimal a;
  private final BigDecimal b;
}
Run Code Online (Sandbox Code Playgroud)

然后ab是那类的"内部".因为这是BigDecimal他们不可变的实例.如果您实现了类似的操作setBToZero(),则只需重用您的实例,a而不必重新创建新实例.例如

public Vector2d setBToZero() { 
  return new Vector2d(a, 0);
}
Run Code Online (Sandbox Code Playgroud)

您共享内部a,因为它是不可变的,您不必担心共享状态的更改.当涉及到大型物体时,这尤其有用.如果使用接口,则只能使用代理对象来实现某些操作.