如何有效地使用静态方法?

时间:2013-05-20 15:34:03

标签: java object static

我不确定我是否正确使用静态方法。我明白他们是如何工作的。

假设我有一个名为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类中的方法设置为非静态方法,并且每次创建新播放器时都调用该方法。

5 个答案:

答案 0 :(得分:2)

静态字段和方法应该表示类的无状态属性;即与特定物体无关。

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

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

理想情况下,至少在我看来,个别球员不应该真正关注球员的收集。因此,你提出的静态功能不是一个好的设计。

答案 1 :(得分:1)

这是设计的问题,显然包含了很多个人偏好。

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

public class PlayerFactory {
    private int numPlayers = 0;

    public int getNumPlayers() { ... }

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

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

根据您的确切用例和代码风格,您可能更喜欢一种变体。但了解这些模式并认识它们是很好的。并记录下来。通过调用类SomethingFactory,您可以向其他开发人员提示此类遵循工厂模式。例如。

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

您也可以将此课程称为GamePlayers ...

答案 2 :(得分: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(....)

答案 3 :(得分:0)

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

如果您认为应该使用静态功能,请不要这样做! 只要按照旧规则玩,就不要使用任何静态的东西,直到你老了,聪明一点,你也许可以把它用在一些非常特殊的角落里。

答案 4 :(得分: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通过game.addPlayer(newPlayer)添加玩家,并通过game.getNumOfPlayers()获取玩家数量。

动态分配玩家列表。

对于 static not static ,我更喜欢非静态版本,因为玩家是游戏的一部分,而且可以认为他们可能是几个游戏 - 玩家将成为游戏实例的一部分。