有些奇怪的事情发生了,假设我的代码带有'Attachment'对象,我想将所有对象设置为NULL。
List<Attachment> attachments = getAttachments();
for (Attachment attachment: attachments)
{
attachment = null;
}
立即对象附件已成功设置为NULL。但是支持系列没有受到影响。它仍然有旧数据。我以为我们总是可以依赖Java中的引用?
答案 0 :(得分:8)
是的,如果您正确理解它们,您可以依赖Java中的引用。您有一个引用变量attachment
,但它是引用您想要设置为null
的对象的2个引用之一。
attachments -> { Attachment, Attachment, Attachment }
| | |
v v v
attachment --> (object) (object) (object)
将null
分配给attachment
时,列表引用不会更改。
attachments -> { Attachment, Attachment, Attachment }
| | |
v v v
attachment (object) (object) (object)
|
v
(null)
增强的for循环不允许您以这种方式更改列表内容。
您可以使用传统的for循环,并调用set
:
for (int i = 0; i < attachments.size; i++)
{
attachments.set(i, null);
}
顺便说一句,目前还不清楚为什么要将所有元素都设置为null
。这会在列表中留下null
的 n 个副本。另一种方法是删除对attachments.clear()
列表的所有引用,列表中根本不会引用任何引用,甚至null
也不会引用,如果这是你真正想做的事情。
答案 1 :(得分:1)
在增强的for循环中遍历它时,无法修改Collection
的内容。
每次迭代时得到的attachment
对象就像集合中对象的副本(它实际上只是对该对象的另一个引用),所以基本上你要为该'临时'对象赋值为null,不是集合中的实际元素。
答案 2 :(得分:0)
为附件变量赋值null不能改变集合,因为附件是对Attachment对象的引用,而不是对集合本身的引用。
您的附件集合包含对附件对象的引用。循环的每次迭代,Java都会将集合中的下一个对象引用分配给附件变量。如果您随后更改了附件变量,则无法更改集合本身。
答案 3 :(得分:0)
增强型 /**
* @param string $context
* @return ProxyQueryInterface
*/
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
$query->leftJoin('o.followUpNews', 'fun')
->addSelect('COALESCE(fun.importDate, o.importDate) AS HIDDEN sortDate')
->addOrderBy('sortDate');
return $query;
}
语句标头中的标识符声明局部变量,如Java Language Specification中所述。在您的情况下,for
是一个局部变量。当您将其设置为attachment
时,它不会影响它指向的对象。