4

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

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

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 对象的引用。一种方法是让每个游戏对象在静态数据结构中注册自己。

例如,您可以这样做:

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>这里使用 a 是为了在没有其他对它的引用时,该集合不会阻止游戏被垃圾收集。

于 2012-11-13T21:39:04.137 回答
1

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

一旦有了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 回答