计算班级中的成员数量

时间:2014-01-15 15:15:58

标签: java

我正在学习Java的小游戏。 现在我想计算玩家的数量,我有代码:

    Player player1;
    player1 = new Player();

    player1.name = "Name1";
    player1.score = 0;
    player1.lives = 100.0;

    Player player2;
    player2 = new Player();

    player2.name = "Name2";
    player2.score = 0;
    player2.lives = 50.0;

3 个答案:

答案 0 :(得分:1)

在玩家中使用static variable计数,该计数在玩家构造函数中递增。

private static int playerCount = 0;

//constructor
Player(){   
  playerCount++; 
}

答案 1 :(得分:0)

将所有玩家列入名单:

List<Player> allPlayers = new ArrayList<Player>();
Player player;

player = new Player();
player.name = "Name1";
player.score = 0;
player.lives = 100.0;

allPlayers.add(player);

player = new Player();
player.name = "Name2";
player.score = 0;
player.lives = 50.0;
allPlayers.add(player);

allPlayers.size(); //Number of players
player = allPlayers.get(0); //Player 1
player = allPlayers.get(1); //Player 2

答案 2 :(得分:0)

最好的方法是使用容器类,这是java.util.Collections的后代。

添加播放器后,他会被添加到该集合中。当玩家退出游戏时,他将从集合中删除。因此,要确定任何时刻的玩家数量,只需要计算集合的成员(如果使用java.util预先实现的集合,则已经实现了该成员)。

即使这样,也有两种技术。其中一个是有缺陷的,我将首先展示有缺陷的技术(这并不比其他人提供的静态计数器示例好得多)。

private static HashSet<Player> players = new HashSet<Player>();

public Player() {
  players.add(this);
}

public static int getPlayerCount() {
  return players.size();
}

这导致了一个有趣的问题。播放器计数永远不会下降,因为即使Player类被取消引用,计数集合也会保存一个防止垃圾收集的引用。这导致java版本的“垃圾泄漏”,但不要将它与C / C ++“垃圾泄漏”混淆,后者更加邪恶。

第二种技术源于解决第一种问题。基本上,它不依赖于建筑登记,因为破坏是一种不安全的取消登记手段。在一段代码中你会有

HashSet<Player> players = new HashSet<Player>();
Player player = new Player("bob");
players.add(player);

... later on ...

players.remove(player);

或类似的东西。基本上,主要想法是让您当前的玩家列表与玩家创建的级别相同。有一百万种变种,取决于始发呼叫的来源;但是,主要思想是相同的:明确取消注册玩家,而不是直接与对象生命周期联系起来。