gpt4 book ai didi

java - 尝试强连接对象时出现奇怪的指针问题

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:23 25 4
gpt4 key购买 nike

在我的程序中,我有两个类,一个称为 GlassPiece,另一个称为 TrackerChip。

这两个对象始终是“强连接”的,即没有两个GlassPiece可以共享一个TrackerChip,也没有两个TrackerChips可以共享一个GlassPiece。因此,在我的 setter 方法中,我需要小心断开任何旧的引用,如下所示:

public class TrackerChip
{
GlassPiece linkedGlassPiece;

public void setGlassPiece(GlassPiece newGlassPiece)
{
GlassPiece oldGlassPiece = linkedGlassPiece;

linkedGlassPiece = newGlassPiece;

if(oldGlassPiece != null)
{
oldGlassPiece.setTrackerChip(null); //disconnect old GlassPiece
}

if(linkedGlassPiece != null && linkedGlassPiece.getTrackerChip() != this)
{
linkedGlassPiece.setTrackerChip(this); //update counterpart
}
}
}

GlassPiece.setTrackerChip(TrackerChip) 方法的工作方式完全相同。

问题是,上面的代码实际上不起作用,并且当尝试管理几个不同的 GlassPieces 和 TrackerChips 之间的链接时会发生奇怪的事情。但是,如果我将最后一部分替换为:

    if(newGlassPiece != null && newGlassPiece.getTrackerChip() != this)
{
newGlassPiece.setTrackerChip(this);
}

然后一切正常。这对我来说似乎很奇怪(我所做的只是将实例变量 linkedGlassPiece 替换为参数 newGlassPiece)。但在该方法的早期,我将引用设置为彼此相等!为什么第一种方法不起作用?

附注我可以确认该方法中没有无限循环。

最佳答案

至于为什么这不起作用,你是对的,它不会陷入无限循环,但它不会做你期望的事情。

  1. 您输入setGlassPiece,将此对象的linkedGlassPiece 设置为newGlassPiece 的值。
  2. 然后它在 oldGlassPiece 上调用 setTrackerChip(null)。
  3. oldGlassPiece 仍然引用原始 TrackerChip,因此它调用 setGlassPiece(null),它将 linkedGlassPiece 设置为您刚刚在 TrackerChip 上设置的 null,并在 NEW GlassPiece 上调用 setTrackerChip(null)。

老实说,我想不出一种方法让它按照你的方式工作。您必须添加一些额外的参数,使其不再可重入。也就是说,当您在 oldGlassPiece 上调用 setTrackerChip 时,它不会转身调用相同的 TrackerChip 将其引用设置为 null。也许只是一个 boolean 标志,表明它不应该使第二级引用无效。

这是一些代码:

public class TrackerChip
{
GlassPiece linkedGlassPiece;

public void setGlassPiece(GlassPiece newGlassPiece)
{
setGlassPiece(newGlassPiece, true);
}

public void setGlassPiece(GlassPiece newGlassPiece, boolean reentrant)
{
GlassPiece oldGlassPiece = linkedGlassPiece;

linkedGlassPiece = newGlassPiece;

if(reentrant && oldGlassPiece != null)
{
oldGlassPiece.setTrackerChip(null, false); //disconnect old GlassPiece
}

if(linkedGlassPiece != null && linkedGlassPiece.getTrackerChip() != this)
{
linkedGlassPiece.setTrackerChip(this); //update counterpart
}
}
}

关于java - 尝试强连接对象时出现奇怪的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5447136/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com