我有一个名为 Game 的 Java 类,它有一个名为 score 的非静态整数。
我想实现一个静态方法,它将每个游戏对象的分数增加 1,命名为 increaseAllScore()。这可能吗?我可以模拟这样的事情还是有什么办法解决这个问题?
我有一个名为 Game 的 Java 类,它有一个名为 score 的非静态整数。
我想实现一个静态方法,它将每个游戏对象的分数增加 1,命名为 increaseAllScore()。这可能吗?我可以模拟这样的事情还是有什么办法解决这个问题?
你可以用这样的实现来做到这一点:
int score;
static int scoremodifier;
public static void increaseAllScore() {
scoremodifier++;
}
public int getScore() {
return score + Game.scoremodifier;
}
这样做的唯一方法是为静态方法提供一种机制来访问对 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 是为了在没有其他对它的引用时,该集合不会阻止游戏被垃圾收集。
这在技术上是可行的,但通常是一个糟糕的设计*。而是为您的所有游戏创建一个容器(称为它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();
}
}
}
这只是一个实现示例;对于设计,我不会将它们放在同一个班级。