スコアと呼ばれる非静的整数を持つ Game と呼ばれる Java クラスがあります。
各ゲーム オブジェクトのスコアを 1 ずつ増やす静的メソッドを実装したいと思います。これは可能ですか?このようなことをシミュレートできますか、またはこれを回避する方法はありますか?
スコアと呼ばれる非静的整数を持つ Game と呼ばれる Java クラスがあります。
各ゲーム オブジェクトのスコアを 1 ずつ増やす静的メソッドを実装したいと思います。これは可能ですか?このようなことをシミュレートできますか、またはこれを回避する方法はありますか?
次のような実装でそれを行うことができます:
int score;
static int scoremodifier;
public static void increaseAllScore() {
scoremodifier++;
}
public int getScore() {
return score + Game.scoremodifier;
}
これを行う唯一の方法は、静的メソッドが 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>
いるのは、他に参照がない場合にセットがゲームのガベージコレクションを妨げないようにするためです。
技術的には可能ですが、一般的に悪い設計です*。代わりに、作成class Games
されたすべてのインスタンスへの参照を保持するすべてのゲームのコンテナを作成します(これを呼び出します)Game
。ほとんどGames
の場合、クラスには、createGame()
作成されたすべてのゲームのライフサイクルを完全に制御するメソッドがあります。
クラスを作成すると、作成されたすべてのインスタンスを基本的に反復し、それらすべてのスコアを1つずつ増やすGames
非静的メソッドを使用できます。increaseAllScores()
Game
*-static List<Game>
すべてのインスタンスを作成し、Game
コンストラクター内でそのリストを変更します。
これは、問題の解決策の概要です。
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();
}
これは可能ですが、ある程度の簿記が必要です。本質的には、既存のすべてのゲームへの静的なポインターのセットを保持する必要があります。ゲームのコンストラクターでは、このリストに追加する必要があり、デストラクタで再度削除する必要があります。
おそらくより良い方法は、と呼ばれる静的変数scoreOffset
または同様のものを持つことです。次に、インスタンススコアを取得し、静的を追加することで、ゲームのスコアを計算できますscoreOffset
。
increaseAllScore
これを行うことができるのは、メソッドがのインスタンスに静的にアクセスできる場合のみですGame
(引数でリストを渡すか、静的に保存されたリストがある場合があります)。
それは不可能; まず、オブジェクト指向プログラミングの基礎を学びます。
苦労して、すべてのゲームへの参照を保持できます。
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();
}
}
}
これは単なる実装例です。設計のために、私はそれらを同じクラスに配置しません。