2013-05-20 47 views
0

我從來不確定我是否正確使用靜態方法。我明白他們是如何工作的。如何有效地使用靜態方法?

比方說,我有這個類中調用播放器(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類中嗎?或者,我應該讓我的Game類中的方法成爲非靜態方法,並且每次調用方法時,我應該每次增加numOfPlayers變量(通過構造函數)

我創建了一個新玩家。

+3

我不會讓靜態的。我會在某處列出一個'List 球員',其大小將是球員人數。 –

+0

玩家不應該有玩家人數的靜態方法。這是更高的抽象。 –

+1

我也不會使這個靜態的。畢竟,你可能有不止一次的「遊戲」,每次都有不同數量的玩家。或者像上面Peter提到的那樣有一個List的玩家列表,或者讓'numPlayers()'成爲'Game'的非靜態方法。 – 2013-05-20 15:36:48

回答

1

這是一個問題設計,這顯然包括很多個人喜好。

你真的應該看看工廠設計模式,這是處理這種情況的好方法。在這裏,你可以有一個

public class PlayerFactory { 
    private int numPlayers = 0; 

    public int getNumPlayers() { ... } 

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

照顧A)適當增加玩家數。

根據您的確切使用案例和代碼風格,您可能會喜歡偏好一個變種或其他。但瞭解這些模式並認識它們是很好的。並記錄它們。例如,通過調用類SomethingFactory,您可以向其他開發者暗示此類遵循工廠模式。

請注意,我做了而不是需要在上面的例子中使用static,假設工廠只能實例化一次。通常會看到構造函數private,而該類只有一個public static final實例。

你也可以調用這個類GamePlayers ...

+0

您可以創建整個Factory作爲Singleton,以避免可能的重複實例。 –

+0

@MartinPerry,這是我討論的「公共靜態最終」方法。但是,在服務加載器上下文中,這可能是不可能的。這些通常需要一個無參數的公共構造函數。 –

+0

您可以使用Initialize方法而不是ctor –

2

靜態字段和方法應該表示一個類的無狀態屬性;即與特定對象不相關。

但要注意與靜多線程,因爲全班都必須被鎖定,而不僅僅是一個對象。這可能導致併發瓶頸

至於你numOfPlayers,你可能最終爲玩家開發別的地方的集合,在這種情況下該功能將在該集合的方法不是在播放器類。

理想的情況下,在我看來,至少,每個運動員應該真正關心球員們集合。因此,諸如你所提議的靜態功能將不是好的設計。

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(); 
    } 
} 

如果你願意,你可以使這個類的 「靜態」 使用辛格爾頓。但是儘量避免靜態類。

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(....) 
0

你怎麼樣有玩家的列表中你的遊戲,玩家的數量是List的大小。

當你認爲你應該爲某些功能使用靜態的,不這樣做! 只要沿着舊的規則玩,永遠不要使用任何靜態的東西,直到你老,聰明,你也許可以用它來做一些非常特殊的角落案例。

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()增加一名球員,並得到玩家的數量。

玩家列表是動態分配的。

至於靜態不是靜態,我喜歡這裏的非靜態版本,玩家是遊戲的一部分,一個可以考慮他們可能是幾場比賽 - 和玩家會Game的一個實例的一部分。

相關問題