0

私はこれまで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オーバーライドすることもありませんが、次の実装でオーバーライドします。removeDrawable

//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つのコードブロックで異なる結果を生成するにはどうすればよいでしょうか。

4

3 に答える 3

1

を呼び出すときに同じ結果が期待されますが、コードのの場所から呼び出されるとdecay()、クラスの動作が異なる場合があります。remove()

IDEを使用して、remove()メソッドの使用法を検索すると、すべてが明らかになる場合があります。

于 2012-08-03T03:46:59.587 に答える
1

コメントであなたはこれを言いました:

removeは、SolidRectangleとして認識し、((SolidRectangle)snowflake).remove()と呼ばれるCollisionHandlerによって呼び出されるため、コードのSnowflakeバージョンではなくDrawableバージョンと呼ばれます。

これは正しい説明ではないと思います。

あなたはこれを言っているようです:

Snowflake snowflake = ...
((SolidRectangle) snowflake).remove();

オーバーライドさSolidRectangle.remove()れたメソッドがスノーフレークで呼び出される原因になります。それは正しくありません。メソッドがオーバーライドされると、を呼び出すメソッド(またはスーパータイプメソッド)Snowflake以外では、メソッドを呼び出すことはできません。SnowflakeSnowflakesuper.remove()

于 2012-08-03T04:02:02.893 に答える
0

私はそれを考え出した。問題はSnowflake.Mempool、スタックとして機能するため、最近破壊された雪片が新しい雪片の作成に使用されることでした。私はすべてのDrawable要素をに保持しましたArrayList<Drawable>。この組み合わせにより、特定の雪片が2回出現し、ArrayList<Drawable>その結果、フレーム調整アルゴリズムが機能しなくなりました。に切り替えるとHashSet<Drawable>問題が解決しました。

于 2012-08-03T04:32:48.487 に答える