[英]How would I use a static method to increase a non-static variable?
我有一個名為Game的Java類,它有一個名為score的非靜態整數。
我想實現一個靜態方法,它將每個Game對象的得分增加1,名為increaseAllScore()。 這可能嗎? 我能模擬這樣的事情還是有什么方法可以解決這個問題?
你可以用這樣的實現來做到這一點:
int score;
static int scoremodifier;
public static void increaseAllScore() {
scoremodifier++;
}
public int getScore() {
return score + Game.scoremodifier;
}
唯一的方法是為靜態方法提供一種機制來訪問對Game對象的引用。 一種方法是讓每個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++;
}
}
}
}
我在這里使用WeakReference<Game>
,這樣當沒有其他引用時,該集合不會阻止游戲被垃圾收集。
這在技術上是可行的,但它通常是一個糟糕的設計* 。 而是為您的所有游戲(稱為class Games
)創建一個容器,該容器將保存對所有已創建的Game
實例的引用。 很可能Games
類將使用createGame()
方法來完全控制所有創建的游戲的生命周期。
一旦你有了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();
}
}
}
這只是一個實現示例; 對於設計我不會把它們放在同一個類中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.