一个物体可以自行移除吗? 怎么样?

我正在尝试编写一个简单的球类游戏,并且有几个回合(即,球的生命)。 当球通过屏幕的底部边界时,球“死亡”。 到目前为止我的工作,但似乎不是正确的做事方式:

if (ball.getY() > bottomOfScreen) { ball.die(); remove(ball); } 

die()方法基本上慢慢地淡化了球的颜色(dark_gray – > pause(50) – > light_gray – > pause(50)),但实际上并没有做任何有用的事情。

显然,remove()从屏幕上移除了球,这就是我想要的。 我认为这个remove()是Ball的die()方法的一部分是有道理的,而不是在主程序中它是一个单独的方法调用 – 但是我不知道该如何解决这个问题?

对象可以自行删除吗? 而且,如果可以的话,从哲学/方法论的角度来看,对象自杀是否比对象谋杀更好?

谢谢!

该对象可以删除自身,因为它具有对视图呈现机制的某种引用。 您的示例没有提供足够的信息,因此我将举例说明一种方法:

 public class Ball { private ViewRenderer view; public void remove() { view.remove(this); } } 

无论是自杀还是谋杀都不是更好或更糟。 这取决于您的设计和要求。

但是在这个例子中, 谋杀可能更可取,因为这样Ball对象不需要知道它在哪个上下文中被使用。

可以创建一种球自身移除的方法,但这是一件坏事。 为了从屏幕上移除自己,Ball必须具有对屏幕的引用。 这会创建一个循环的参考链(Ball有一个参考屏幕,屏幕有一个参考Ball),这将使你的设计更复杂,你的测试更加复杂。

自杀很好 – 屏幕告诉球死了,球就死了。 但这是关于消除关系,而不是死亡。 维持这种关系的东西就是屏幕,因此它应该是删除的东西。

还要记住,两者不一定要一起发生。 由于某种原因,屏幕可能想要保持一个死球,它可能想要移除一个没有死的球。 即使您的应用程序现在没有发生这种情况,也请考虑这种可能性。

从某种意义上说,从内存中删除对象:不,在Java中由垃圾收集器专门处理。

你可以做的是从包含它的集合中删除对象,但这需要对象有权访问这些集合(在大多数情况下这是不可行的,因为可能有很多集合)。

我建议包含对象(在你的情况下是屏幕)轮询包含的对象(球的)状态,并在它实际死亡后将其删除。

可能有一些对象(例如,屏幕或Johan的示例中的ViewRenderer)持有对Ball的引用,并且必须通过Screen(“对象谋杀”)来删除此引用。 “对象自杀”相当于Ball向屏幕传递消息,要求被“谋杀”。

因为Ball知道它何时通过了边界,所以对我来说(不知道你的设计的细节)对于球的移除是有意义的。 然后屏幕可以通过以下几种方法之一找出这种变化:

  • 屏幕可以轮询球。
  • Ball可以直接向后引用屏幕,这会产生一个不幸的循环依赖。
  • Ball可以通过BallObserver界面保存对屏幕的引用。 这是观察者模式的应用。

第一个是最简单的,如果它自然地适合您的屏幕绘制机制,这将是一个很好的选择。 第三种原则上更灵活,但在实践中可能不需要这种灵活性。 在一个简单的程序中,中间选项可能没问题,但您应该将其视为迈向第三个程序的一步。

如果你没有 Screen(或ViewRenderer,或其他)对象,并且真正意味着“在主程序中单独调用方法”,那么你应该重新考虑你的设计。

不,物品不能自杀。 任何自己的引用都只是一个参考。

要清除自身内的对象,只需清除所有实例变量即可。

要“清除”自身外部的对象,可以将变量设置为null。