在 Clojure Programming (OReilly) 中有一个示例,其中 java.io.BufferedWriter 和 java.io.Printwriter 都放在一个代理中(每个代理一个)。然后将这些写入代理操作内部。这本书说在代理动作中执行 io 是安全的。据我了解,代理操作中的所有副作用操作都可以。这是因为只有在提交成功时才会运行提交中的代理操作。其他代理操作中的代理操作仅在外部代理操作成功完成后运行。一般来说,代理动作保证是连续应用的。
Clojure文档说:“代理的状态本身应该是不可变的……”。
据我了解,atoms 和 refs 必须保持不可变值的原因是 clojure 可以回滚并重试多次提交。
我不明白的是:
1:如果 Clojure 确保代理操作只运行一次,为什么代理值必须是不可变的。(例如,如果我在代理中保存一个 java 数组,并在代理操作中添加到它,这应该没问题,因为该操作只会运行一次。这与向 BufferedWriter 添加行非常相似)
2:java.io.BufferedWriter 被认为是不可变的吗?我知道您可以对一个有稳定的引用,但是如果代理操作正在对其执行 io,它是否仍应被视为不可变的?
3:如果BufferedWriter被认为是不可变的,如何判断其他类似的java类是否不可变?