我正在尝试编写一个简单的球类游戏,并且有几个回合(即,球的生命)。当球通过屏幕的底部边界时,球“死亡”。到目前为止我的工作,但似乎不是正确的做事方式:
if (ball.getY() > bottomOfScreen) {
ball.die();
remove(ball);
}
die()方法基本上慢慢地淡化了球的颜色(dark_gray - > pause(50) - > light_gray - > pause(50)),但实际上并没有做任何有用的事情。
显然,remove()从屏幕上移除了球,这就是我想要的。对于我来说这个remove()是Ball的die()方法的一部分是有意义的,而不是它是主程序中的单独方法调用 - 但我不知道该怎么做呢?
对象可以自行删除吗?并且,如果可以,从哲学/方法论的角度来看,对象自杀是否比对象谋杀更好?
谢谢!
答案 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知道它什么时候通过了边界,所以对我来说(不知道你的设计的细节)对于由球发起的移除是有意义的。然后屏幕可以通过以下几种方法之一找出这种变化:
BallObserver
界面保存对屏幕的引用。这是observer pattern。第一个是最简单的,如果它自然适合您的画面绘制机制,这将是一个很好的选择。第三种原则上更灵活,但在实践中可能不需要这种灵活性。在一个简单的程序中,中间选项可能没问题,但你应该把它看作是通往第三个程序的一步。
如果你没有拥有一个Screen(或ViewRenderer,或其他)对象,并且真正意味着“在主程序中单独调用方法”,那么你应该重新考虑你的设计。
答案 4 :(得分:0)
要清除自身内的对象,只需清除所有实例变量即可。
要“清除”自身之外的对象,可以将变量设置为null。