我有一个名为Game的Java类,它有一个名为score的非静态整数。
我想实现一个静态方法,它会将每个Game对象的得分增加1,名为increaseAllScore()。这可能吗?我可以模拟这样的事情,还是有办法解决这个问题?
答案 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();
}
}
}
这只是一个实现示例;对于设计我不会把它们放在同一个类中。