2016-07-05 28 views
0

我目前正在重構我爲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(); 
} 

我所試圖做的是之前構建inputBoardoutputBoard對象設定在BoardtotalRowstotalColumns的靜態值。我想這樣做的原因是因爲構建擴展Board(抽象類)的實例時,我需要具有這些值。我將這些值設爲靜態的原因是因爲它們應該在從Board延伸的所有實例中相同,因此我可以在整個應用程序中執行類似Board.getTotalColumns()的操作。

我認爲這是可疑的不好的原因是因爲它可能會聲明inputBoardoutputBoard沒有首先設置靜態成員變量,當然它也可能意外設置靜態成員的值後到任何任意值。

另一種方法我想到的是要在GameSettings公共的和靜態的干將,這樣我可以做這樣的事情,而不是:

public abstract class Board 
{ 
    private static final int totalColumns = GameSettings.getCodeLength(); 
    private static final int totalRows = GameSettings.getNumOfGuesses(); 

    // other stuff... 
} 

這將讓我避免使用setter和使用有關的問題他們如上所列。但是這不會打敗實例化對象的目的嗎?

您認爲更好的替代方法是什麼?

+1

不要有擺在首位靜態也沒有做'Board.getTotalColumns()'。這種靜態使用是違反所有面向對象的想法。你的'Board'構造函數需要一個'GameSettings'對象。與Board相互作用的類需要在構造函數中等等。 – zapl

+0

@zapl感謝您的評論。當你知道某些東西的價值不會因實例而改變時,我認爲靜態是有用的。你是建議,而是我做的是這樣的:\t'inputBoard = new InputBoard(gameSettings.getCodeLength(),gameSettings.getNumOfGuesses());'' – nigiri

回答

0

我不是設計模式方面的專家。我會嘗試像下面 -

Board.java

abstract class Board { 
    private final GameSettings gameSettings; 

    Board(GameSettings gameSettings) { 
     this.gameSettings = gameSettings; 
    } 
    public int getTotalColumns() { 
     return gameSettings.getCodeLength(); 
    } 
    public int getTotalRows() { 
     return gameSettings.getNumOfGuesses(); 
    } 

    //Other abstract methods 
} 

InputBoards的.java

class InputBoards extends Board { 
    InputBoards(GameSettings gameSettings) { 
     super(gameSettings); 
    } 
} 

OutputBoards的.java

class OutputBoards extends Board { 
    OutputBoards(GameSettings gameSettings) { 
     super(gameSettings); 
    } 
} 

GameSettings的.java

class GameSettings { 
    public int getCodeLength() { 
     //return your value; 
    } 
    public int getNumOfGuesses() { 
     //return your value; 
    } 
} 

現在我會做 -

public GameLogic(GameSettings gameSettings) { 
    inputBoard = new InputBoard(gameSettings); 
    outputBoard = new OutputBoard(gameSettings); 
} 
相關問題