【问题标题】:What is the best way to initialise static members before constructing objects in Java?在 Java 中构造对象之前初始化静态成员的最佳方法是什么?
【发布时间】:2016-07-05 13:23:01
【问题描述】:

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

我要做的是在构造inputBoardoutputBoard 对象之前在Board 类中设置totalRowstotalColumns 的静态值。我之所以要这样做是因为在构建扩展 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 对象的目的吗?

您认为解决此问题的更好选择是什么?

【问题讨论】:

  • 一开始就不要静态,也不要Board.getTotalColumns()。这种静态使用违背了所有 OOP 思想。您的 Board 构造函数需要一个 GameSettings 对象。与Board 交互的类在它们的构造函数中需要它等等。
  • @zapl 感谢您的评论。我认为当您知道某物的价值不会在实例之间发生变化时,静态很有用。你是不是建议我做类似的事情:inputBoard = new InputBoard(gameSettings.getCodeLength(), gameSettings.getNumOfGuesses());

标签: java oop refactoring settings


【解决方案1】:

我不是设计模式方面的专家。我会尝试以下类似的方法-

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 2018-01-17
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多