在Java中构造对象之前初始化静态成员的最佳方法是什么?

时间:2016-07-05 13:23:01

标签: java oop refactoring settings

我目前正在重构我为Mastermind棋盘游戏的文本/控制台版本编写的代码。我对如何最好地改进本部分GameLogic课程感到困惑。

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

我要做的是在构建totalRowstotalColumns对象之前,在Board类中设置inputBoardoutputBoard的静态值。我想这样做的原因是因为我需要在构造扩展Board(抽象类)的实例时使用这些值。我将这些值设置为静态的原因是因为它们在从Board扩展的所有实例中应该是相同的,因此我可以在整个应用程序中执行类似Board.getTotalColumns()的操作。

我认为这是可疑的原因是因为在没有先设置静态成员变量的情况下可以声明inputBoardoutputBoard,当然也可能会意外地设置稍后静态成员的值为任意值。

我想到的另一种方法是将GameSettings中的getter设为public和static,这样我就能做出类似的事情:

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

    // other stuff...
}

这将允许我避免使用setter以及与上面列出的使用它们相关的问题。但这不会破坏实例化GameSettings对象的目的吗?

您认为采用这种方法的更好方法是什么?

1 个答案:

答案 0 :(得分: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);
}