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

What is the best way to initialise static members before constructing objects in Java?

我目前正在重构我为 text/console 版本的 Mastermind 棋盘游戏编写的代码。我对如何最好地改进这一部分我有点困惑 GameLogic class.

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

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

我认为这很糟糕的原因是因为可以在不首先设置静态成员变量的情况下声明 inputBoardoutputBoard,当然也有可能不小心稍后将静态成员的值设置为任意值。

我想到的另一种方法是在 GameSettings public 中制作 getters 和静态,这样我就可以做这样的事情:

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

    // other stuff...
}

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

您认为解决此问题的更好替代方法是什么?

我不是设计模式方面的专家。我会尝试像下面这样的东西 -

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
}

输入板 .java

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

输出板 .java

class OutputBoards extends Board {
    OutputBoards(GameSettings gameSettings) {
        super(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);
}