簡體   English   中英

我如何使用靜態方法來增加非靜態變量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM