我不确定我是否正确使用静态方法。我明白他们是如何工作的。
假设我有一个名为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类中的方法设置为非静态方法,并且每次创建新播放器时都调用该方法。
答案 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
实例。
您也可以将此课程称为Game
或Players
...
答案 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 ,我更喜欢非静态版本,因为玩家是游戏的一部分,而且可以认为他们可能是几个游戏 - 玩家将成为游戏实例的一部分。