G'day大师,
我编写了一些利用Java库的代码,该库使用了访问者模式。我想要的是在一个Clojure函数后面隐藏访问者等所有杂乱的细节,该函数接受输入参数并返回一个包含访问者派生的所有状态的简单数据结构。
诀窍是Java端有多个“visitXXX”回调,并且没有简单的方法可以将状态返回给它们(Java,即Java,假设由各种访问者构建的任何状态都存储在实例变量)。
我所做的(并且看起来效果很好,fwiw)是在一个let块中定义一个原子,让我的每个访问者函数都交换掉!当Java访问代码调用时,原子具有更新的值。然后,在Java访问者完成之后,我将deref'ed原子返回到主“driver”函数的末尾。
我的问题是:这是原子的适当用法吗?如果没有,是否有更惯用的方式来做到这一点?
如果有人感兴趣,相关代码为here。
免责声明:我仍然是一个Clojure n00b,所以代码可能对更挑剔的眼睛是可怕的。评论/反馈/批评欢迎!
提前致谢!
答案 0 :(得分:2)
使用原子的方法很好,看起来很好并且很好。
如果您正在寻找其他方法;因为您可以将问题分解为一些代码,这些代码将生成并回答(您的访问者)以及其他需要答案的代码,Clojure的promise
和deliver
函数可能非常适合。
如果您在let块中创建了promises,那么让访问者deliver
将结果发送给承诺。