私はこれまでJavaでこの種の問題に遭遇したことはありません。このすべてのコードと完全なプロジェクトは、私のGitHubにあります。クラス階層を持つSnowflake
クラスがあります。
Snowflake extends SolidRectangle extends Movable extends Drawable extends Object
私のクラスの次の2つのコードセクションは、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
//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プログラマーの日の一部ではないことは知っていますが、これらの雪片の作成とガベージコレクションにはオーバーヘッドが多すぎることがわかったので、このオーバーヘッドを回避するために古い雪片を再利用するだけだと思いました。これに気を取られないでください。私の質問は、最初の2つのコードブロックが機能的に同等であるように見える場合に、それらがどのように異なる可能性があるかについてです。
では、最初の2つのコードブロックで異なる結果を生成するにはどうすればよいでしょうか。