Groovy:两个变量是指同一个对象吗?

时间:2014-07-25 11:52:05

标签: grails

我正在为一个网站调试一些Groovy代码并遇到了一个问题,我在流程的一部分中在控制器中创建了一个object A并在其中设置了一个变量(读回来并且正确)。

然后我在不同的控制器中找到我所理解的相同对象。但是变量不再设置。

我假设第一个控制器中的object A与拾取第二个控制器的object A相同是错误的,或者某些东西修改了途中的值。

所以,这可能是一个非常基本的问题(我有一种可怕的感觉,它表明我对Groovy / Java如何工作有一些基本的误解 - 所以请温柔): 如何判断object A中的controller 1是否与控制器2中的object A相同(我指的是同一个对象,而不是它们是等价的)。< / p>

2 个答案:

答案 0 :(得分:2)

  然后我接受了我对同一个对象的理解   不同的控制器。

如果您展示了您在第一个控制器中所做的事情以及您在第二个控制器中正在做什么的示例,这将有助于澄清正在发生的事情。目前尚不清楚上述句子中的“拾取”是什么意思。

如果您可以同时编排具有2个引用的内容,则可以调用o1.is(o2),它会告诉您o1是否指向与o2相同的对象。您可以用来帮助调试情况的是第一个控制器,您可以调用System.identityHashCode(o1),在第二个控制器中,您可以调用System.identityHashCode(o2)并查看它们是否返回相同的值。

在Web应用程序中,有时候同一个对象的概念可能不明确。例如,如果您有2个单独的代理但它们代理同一个实例,那么您可以将上下文视为同一个对象。另一个例子是,如果你正在处理持久化实体,你可以在内存中有2个独立的实例,它们实际上对应于数据存储中的同一个记录。

无论如何,上面提到的identityHashCode方法是一种可以用来知道这些对象是否是同一个对象的技术。如果这不适合你,你可以显示一些代码或提供一些可能有用的细节。

答案 1 :(得分:1)

如果您想在多个控制器中提供一些变量,可以通过以下方式之一进行:

  • 将对象放入session
  • 将对象放入flash scope
  • 将对象放在flow scope中 - 您必须确保您正在访问相同的流程。
  • 使用singleton service永久或暂时保留该值
  • 在某处使用static field(但永远不会使用)