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

时间:2011-09-01 12:46:10

标签: java object

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

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

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

显然,remove()从屏幕上移除了球,这就是我想要的。对于我来说这个remove()是Ball的die()方法的一部分是有意义的,而不是它是主程序中的单独方法调用 - 但我不知道该怎么做呢?

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

谢谢!

5 个答案:

答案 0 :(得分:5)

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

public class Ball {
    private ViewRenderer view;

    public void remove() {
       view.remove(this);
    }
}

自杀谋杀无论好坏。这取决于您的设计和要求。

在此示例中,谋杀可能首选,因为Ball对象需要知道它正在使用哪种上下文。

答案 1 :(得分:3)

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

自杀很好 - 屏幕告诉球死了,球就死了。但这是关于消除关系,而不是死亡。保持这种关系的东西就是屏幕,所以它应该是去除它的东西。

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

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

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

  • 屏幕可以轮询球。
  • Ball可以直接向后引用屏幕,这会产生不幸的循环依赖。
  • Ball可以通过BallObserver界面保存对屏幕的引用。这是observer pattern
  • 的应用程序

第一个是最简单的,如果它自然适合您的画面绘制机制,这将是一个很好的选择。第三种原则上更灵活,但在实践中可能不需要这种灵活性。在一个简单的程序中,中间选项可能没问题,但你应该把它看作是通往第三个程序的一步。

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

答案 4 :(得分:0)

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

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

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