0

我从不太确定我是否正确使用了静态方法。我理解他们是如何工作的。

假设我有一个名为 Player(Java) 的类:

private int money;
private int lot;
private String piece;
private int playerNum;

public Player(String _piece, int _playerNum)
{   
    piece = _piece;
    lot = 0;
    playerNum = _playerNum;
    money = 20000;

}
public int getMoney()
{   
    return money;
}
public int getLot()
{
    return lot;
}
public String getPiece()
{
    return piece;
}

还有一些其他方法 + setter,但它们特定于我创建的播放器对象,现在假设我有一个像这样的静态方法:

private static int numOfPlayers;

public static int numPlayers()
{
   return numOfPlayers;
}

这个 numOfPlayers 方法应该放在哪里?

它应该放在我的 Player 类中吗?每次创建播放器对象的新实例时,我是否应该增加 numOfPlayers 变量?(通过构造函数)

或者,我是否应该让我的 Game 类中的方法是非静态的,并且每次创建新 Player 时都调用该方法。

4

5 回答 5

2

静态字段和方法应该代表一个类的无状态属性;即与特定对象无关。

但是要小心使用静态的多线程,因为整个类必须被锁定,而不仅仅是一个对象。这会导致并发瓶颈

至于您的 numOfPlayers,您可能最终会在其他地方开发一组玩家,在这种情况下,该函数将是该集合上的方法,而不是玩家类中的方法。

理想情况下,至少在我看来,单个玩家不应该真正关心玩家收藏。因此,您建议的静态功能不是好的设计。

于 2013-05-20T15:38:36.597 回答
1

这是一个设计问题,其中显然包含很多个人喜好。

你真的应该看看工厂设计模式,这是处理这种情况的好方法。在这里,你可以拥有一个

public class PlayerFactory {
    private int numPlayers = 0;

    public int getNumPlayers() { ... }

    public Player makeNewPlayer(...) { ... }
}

负责 A) 适当地增加玩家数量。

根据您的具体用例和代码风格,您可能更喜欢一种变体或另一种. 但是了解这些模式并识别它们是件好事。并记录下来。例如,通过调用一个类SomethingFactory,您可以向其他开发人员暗示该类遵循工厂模式。

请注意,我不需要在上面的示例中使用static,假设工厂可能只实例化一次。通常会看到构造函数private,而类则只有一个public static final实例。

您也可以调用此类GamePlayers...

于 2013-05-20T15:43:30.260 回答
0

你的游戏中有一个玩家列表怎么样,玩家的数量就是列表的大小。

当您认为应该为某些功能使用静态时,请不要这样做!只是按照旧规则玩,永远不要使用任何静态的东西,直到你年老和聪明,并且你也许可以将它用于一些非常特殊的角落案例。

于 2013-05-20T15:40:02.133 回答
0

您可以像这样创建它:

像你class Player一样拥有

创造class Players

class Players 
{
    private List<Player> players = new List<Players>;

    public void AddPlayer(Player pl) 
    { 
        this.players.add(pl); 
    }

    public int GetPlayersCount() 
    { 
        return this.players.size(); 
    } 
}

如果你愿意,你可以使用 Singleton 使这个类“静态”。但尽量避免使用静态类。

class Players 
{
    private List<Player> players = new List<Players>;
    private static Players instance;

    private Players () {};

    public static Players getInstance()
    {
       if (instance == null) 
       {
          instance = new Players ();
       }

       return instance;
    }

    public void AddPlayer(Player pl) 
    { 
        this.players.add(pl); 
    }

    public int GetPlayersCount() 
    { 
        return this.players.size(); 
    } 
}

并像这样使用它

Players players = Players.getInstance();
players.AddPlayer(....)
于 2013-05-20T15:38:54.390 回答
0

我会有另一个班级的玩家名单,例如你建议的游戏。
就像是

class Game {
   private final List<Player> players = new ArrayList<Player>();

   public int getNumOfPlayers() {
     return players.size();
   }

   public void addPlayer(final Player player) {
     players.add(player);
   }
   ...

您通过您的 Game 实例 via 添加玩家gamegame.addPlayer(newPlayer)并通过 获取玩家数量game.getNumOfPlayers()

玩家列表是动态分配的。

至于staticnot static,我更喜欢这里的非静态版本,因为玩家是游戏的一部分,人们可以认为他们可能是几个游戏——玩家将是游戏实例的一部分。

于 2013-05-20T15:42:30.660 回答