制作两个不可变对象的好方法是指彼此?

Bar*_*lom 15 java reflection final immutability

拿这两个Java类:

class User {
   final Inventory inventory;
   User (Inventory inv) {
       inventory = inv;
   }
}

class Inventory {
   final User owner;
   Inventory (User own) {
       owner = own;
   }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法没有使用反射*来解决这个问题?我实际上并不指望它是,但它可以不会受到质疑.

更新:因为在字节码构造中有两个步骤(1.分配对象,2.调用构造函数**)这可能是(ab)用来做手写字节码或自定义编译器吗?我正在谈论首先对两个对象执行步骤1,然后使用步骤1中的参考执行步骤2.当然,类似的东西会相当麻烦,这部分问题是学术性的.

(*因为反射可能会给安全管理员带来麻烦)

(**说我的知识有限)

Joa*_*uer 13

如果其中一个对象是由另一个创建的,那么这只能干净地工作.例如,您可以将User类更改为此类(同时保持Inventory类不变):

class User {
   private final Inventory inventory;
   User () {
       inventory = new Inventory(this);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,您需要注意UserInventory构造函数中访问对象:它尚未完全初始化.例如,它的inventory领域仍然是null!

广告更新:我现在已经验证了字节码操作方法并不起作用.我已经尝试使用Jasmin并且总是无法加载VerifyError.

深入研究这个问题,我找到了§4.10.2.4实例初始化方法和新创建的对象.本节介绍JVM如何确保只传递初始化的对象实例.


Pet*_*rey 7

如果您不需要注入其中一个对象,则可以执行此操作.

class User {
   private final Inventory inventory;
   User () {
       inventory = new Inventory(this);
   }
}
Run Code Online (Sandbox Code Playgroud)