我如何使用静态方法来增加非静态变量?

时间:2012-11-13 21:36:57

标签: java static-methods

我有一个名为Game的Java类,它有一个名为score的非静态整数。

我想实现一个静态方法,它会将每个Game对象的得分增加1,名为increaseAllScore()。这可能吗?我可以模拟这样的事情,还是有办法解决这个问题?

7 个答案:

答案 0 :(得分:5)

你可以用这样的实现来做到这一点:

int score;
static int scoremodifier;

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

public int getScore() {
    return score + Game.scoremodifier;
}

答案 1 :(得分:2)

执行此操作的唯一方法是为静态方法提供一种机制来访问对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>,因此当没有其他引用时,该集合不会阻止游戏被垃圾收集。

答案 2 :(得分:1)

技术上可行,但通常设计不好 * 。而是为您的所有游戏(称为class Games)创建一个容器,该容器将保存对所有已创建的Game实例的引用。最有可能Games类有createGame()类来完全控制所有已创建游戏的生命周期。

一旦你有Games类,它就可以有非静态increaseAllScores()方法,它基本上会迭代所有创建的Game个实例并逐个增加所有这些实例的得分

* - 制作所有实例的static List<Game>并在Game构造函数中修改该列表。

答案 3 :(得分: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();
}

答案 4 :(得分:0)

这是可能的,但需要一些簿记。实质上,你必须保持一组指向所有现有游戏的静态指针。在游戏的构造函数中,您需要将其添加到此列表中,并且需要在析构函数中再次将其删除。

一个更好的方法是拥有一个名为scoreOffset或类似的静态变量。然后,您可以通过获取实例分数并添加静态scoreOffset来计算游戏分数。

答案 5 :(得分:0)

如果increaseAllScore方法对Game的实例具有静态访问权限(您可以在参数中传入列表,或者具有静态存储列表),则只能执行此操作。

答案 6 :(得分: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(); 
        }
    }    
}

这只是一个实现示例;对于设计我不会把它们放在同一个类中。