我从来没有在Java中遇到过这样的问题。所有这些代码和完整的项目可以在my GitHub找到。我有一个Snowflake
类类层次结构:逻辑上等同的代码产生不同的结果
Snowflake extends SolidRectangle extends Movable extends Drawable extends Object
以下两个代码在我Snowflake
类板块产生在我的游戏不同的图形化结果:
//In Snowflake class
public void decay()
{
age++;
color = randomSnowflakeColor();
if(age == 5)
{
super.remove();
Snowflake.Mempool.returnSnowflake(this);
}
}
和
//In Snowflake class
public void decay()
{
age++;
color = randomSnowflakeColor();
if(age == 5)
{
this.remove();
}
public void remove()
{
super.remove();
Snowflake.Mempool.returnSnowflake(this);
}
无论SolidRectangle
也不Movable
覆盖remove
方法,但Drawable
确实与fol降脂实现:
//In Drawable class
public void remove()
{
game.remove(this);
}
和GameContent game
具有以下实现:
//In GameContent class
public synchronized void remove(Drawable drawable)
{
removeQueue.add(drawable);
}
我就饶你的removeQueue
的细节,我只想说,这是你期待什么。
至于Snowflake.Mempool
,我知道手动内存管理通常不是Java程序员日的一部分,但我发现在创建和垃圾收集这些雪花时存在太多的开销,所以我想我会重复使用旧的雪花来避免这种开销。请不要因此而分心。我的问题是关于两个第一代码块如何在功能上等同时可能不同。
那么,两个第一代码块怎么会产生不同的结果呢?
也许不同来自其他调用Snowflake.remove()的东西,它在这两种情况下有不同的行为? – 2012-08-03 03:43:51
将日志记录在每个方法中,以便您可以观察以哪种顺序调用哪个方法。 – 2012-08-03 04:12:04