java - 有什么好方法可以让两个不可变对象(immutable对象)互相引用?

标签 java reflection immutability final

采用这两个 Java 类:

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

class Inventory {
   final User owner;
   Inventory (User own) {
       owner = own;
   }
}

有什么办法without using reflection*把它拉下来?我实际上并不期望它是,但问问也无妨。

更新:因为在字节码构造中有两个步骤(1. 分配对象,2. 调用构造函数**)这是否可以(ab)用于执行此操作,使用手写字节码或自定义编译器?我说的是首先对两个对象执行步骤 1,然后对两个对象执行步骤 2,使用步骤 1 中的引用。当然,这样的事情会相当麻烦,这部分问题是学术性的。

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

(** 表示我的知识有限)

最佳答案

只有当其中一个对象由另一个对象创建时,这才能干净地工作。例如,您可以将 User 类更改为如下内容(同时保持 Inventory 类不变):

class User {
   private final Inventory inventory;
   User () {
       inventory = new Inventory(this);
   }
}

您需要小心访问 Inventory 构造函数中的 User 对象,但是:它尚未完全初始化。例如,它的 inventory 字段仍然是 null!

广告更新:我现在已经确认字节码操作方法不起作用。我试过使用 Jasmin它总是无法加载 VerifyError .

深入研究这个问题,我发现 § 4.10.2.4 Instance Initialization Methods and Newly Created Objects .本节介绍 JVM 如何确保仅传递已初始化的对象实例。

关于java - 有什么好方法可以让两个不可变对象(immutable对象)互相引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7978616/

相关文章:

java - 类 java.util.ArrayList 具有泛型类型参数,请使用 GenericTypeIndicator 代替

java - 如何使用 getConstructor(params).newInstance(args)?

c# - 不可变类型可以改变它的内部状态吗?

c# - 使用反射在结构和类之间复制等效属性

C# 从 IL 中的静态方法调用并返回一个对象

javascript - 为什么我需要卡住 JavaScript 中的对象?

java - 修改列表不应影响其对象 - Java

使用 Apache commons 库的 Java 命令行参数解析问题

java - 编译java servlet程序时出错

java - Java中什么时候需要添加 throws?