4

スコアと呼ばれる非静的整数を持つ Game と呼ばれる Java クラスがあります。

各ゲーム オブジェクトのスコアを 1 ずつ増やす静的メソッドを実装したいと思います。これは可能ですか?このようなことをシミュレートできますか、またはこれを回避する方法はありますか?

4

7 に答える 7

5

次のような実装でそれを行うことができます:

int score;
static int scoremodifier;

public static void increaseAllScore() {
    scoremodifier++;
}

public int getScore() {
    return score + Game.scoremodifier;
}
于 2012-11-13T21:39:53.860 に答える
2

これを行う唯一の方法は、静的メソッドが Game オブジェクトへの参照にアクセスするメカニズムを提供することです。これを行う 1 つの方法は、各 Game オブジェクトを静的データ構造に登録することです。

たとえば、次のようにします。

public class Game {
    private static Set<WeakReference<Game>> registeredGames
        = new HashSet<WeakReference<Game>>();
    private int score;

    public Game() {
        // construct the game
        registeredGames.add(new WeakReference(this));
    }

    . . .

    public static incrementAllScores() {
        for (WeakReference<Game> gameRef : registeredGames) {
            Game game = gameRef.get();
            if (game != null) {
                game.score++;
            }
        }
    }
}

hereを使用してWeakReference<Game>いるのは、他に参照がない場合にセットがゲームのガベージコレクションを妨げないようにするためです。

于 2012-11-13T21:39:04.137 に答える
1

技術的には可能ですが、一般的に悪い設計です*。代わりに、作成class Gamesされたすべてのインスタンスへの参照を保持するすべてのゲームのコンテナを作成します(これを呼び出します)Game。ほとんどGamesの場合、クラスには、createGame()作成されたすべてのゲームのライフサイクルを完全に制御するメソッドがあります。

クラスを作成すると、作成されたすべてのインスタンスを基本的に反復し、それらすべてのスコアを1つずつ増やすGames非静的メソッドを使用できます。increaseAllScores()Game

*-static List<Game>すべてのインスタンスを作成し、Gameコンストラクター内でそのリストを変更します。

于 2012-11-13T21:39:52.490 に答える
0

これは、問題の解決策の概要です。

static final List<Game> games = new ArrayList<>();

public class Game {
  public Game() {
    games.add(this);
  }
}

public static void increaseAllScore() {
  for (Game g : games) game.increaseScore();
}
于 2012-11-13T21:40:57.793 に答える
0

これは可能ですが、ある程度の簿記が必要です。本質的には、既存のすべてのゲームへの静的なポインターのセットを保持する必要があります。ゲームのコンストラクターでは、このリストに追加する必要があり、デストラクタで再度削除する必要があります。

おそらくより良い方法は、と呼ばれる静的変数scoreOffsetまたは同様のものを持つことです。次に、インスタンススコアを取得し、静的を追加することで、ゲームのスコアを計算できますscoreOffset

于 2012-11-13T21:40:58.400 に答える
0

increaseAllScoreこれを行うことができるのは、メソッドがのインスタンスに静的にアクセスできる場合のみですGame(引数でリストを渡すか、静的に保存されたリストがある場合があります)。

于 2012-11-13T21:41:12.660 に答える
0

それは不可能; まず、オブジェクト指向プログラミングの基礎を学びます。

苦労して、すべてのゲームへの参照を保持できます。

public class Game {
    private static List<Game> allGames = new ArrayList<Game>();

    public Game createNewGame() {
        Game game = new Game();
        allGames.add(game); 
        return game;
    }

    public static void increaseAllGames() {
        for (Game game : games) {
            game.increaseScore(); 
        }
    }    
}

これは単なる実装例です。設計のために、私はそれらを同じクラスに配置しません。

于 2012-11-13T21:42:19.353 に答える