我目前正在重構我爲Mastermind棋盤遊戲的文本/控制檯版本編寫的代碼。我有點卡住如何最好的方法改進這一節我的GameLogic
類。在Java中構造對象之前初始化靜態成員的最佳方法是什麼?
public GameLogic(GameSettings gameSettings)
{
// ..other stuff..
// initialise static members
Board.setTotalRows(gameSettings.getNumOfGuesses());
Board.setTotalColums(gameSettings.getCodeLength());
// InputBoard and OutputBoard extends the abstract class Board
inputBoard = new InputBoard();
outputBoard = new OutputBoard();
}
我所試圖做的是之前構建inputBoard
和outputBoard
對象設定在Board
類totalRows
和totalColumns
的靜態值。我想這樣做的原因是因爲構建擴展Board(抽象類)的實例時,我需要具有這些值。我將這些值設爲靜態的原因是因爲它們應該在從Board
延伸的所有實例中相同,因此我可以在整個應用程序中執行類似Board.getTotalColumns()
的操作。
我認爲這是可疑的不好的原因是因爲它可能會聲明inputBoard
或outputBoard
沒有首先設置靜態成員變量,當然它也可能意外設置靜態成員的值後到任何任意值。
另一種方法我想到的是要在GameSettings公共的和靜態的干將,這樣我可以做這樣的事情,而不是:
public abstract class Board
{
private static final int totalColumns = GameSettings.getCodeLength();
private static final int totalRows = GameSettings.getNumOfGuesses();
// other stuff...
}
這將讓我避免使用setter和使用有關的問題他們如上所列。但是這不會打敗實例化對象的目的嗎?
您認爲更好的替代方法是什麼?
不要有擺在首位靜態也沒有做'Board.getTotalColumns()'。這種靜態使用是違反所有面向對象的想法。你的'Board'構造函數需要一個'GameSettings'對象。與Board相互作用的類需要在構造函數中等等。 – zapl
@zapl感謝您的評論。當你知道某些東西的價值不會因實例而改變時,我認爲靜態是有用的。你是建議,而是我做的是這樣的:\t'inputBoard = new InputBoard(gameSettings.getCodeLength(),gameSettings.getNumOfGuesses());'' – nigiri