java - 像这样在构造函数中调用init方法是否违反了Clean Code

标签 java oop coding-style

我在下面的代码中担心的是构造函数的参数实际上并没有直接映射到类的实例字段。实例字段从参数派生值,我正在为其使用 initalize 方法。此外,我做了一些事情,以便可以在下面的代码中直接使用创建的对象,例如调用 drawBoundaries()。我觉得它正在做抽象意义上创建(初始化) Canvas 的意思。

我的构造函数是不是做得太多了?如果我添加方法以从外部显式调用构造函数中的内容,那将是错误的。请让我知道您的看法。

public class Canvas {

private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();

public Canvas(ParsedCells seedPatternCells) {
     initalizeCanvas(seedPatternCells);
}

private void initalizeCanvas(ParsedCells seedPatternCells) {
    setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
    drawBoundaries();
    placeSeedPatternCellsOnCanvas(seedPatternCells);
}
...

P.S.:抱歉,如果这看起来像一个愚蠢的问题;我的代码将由 OOP 大师审查,我只是担心 :-0

编辑:

我读到一些关于 initalizeCanvas() 中的方法被覆盖的担忧——幸运的是这些方法是私有(private)的,不会调用任何其他方法。

无论如何,在对网络进行进一步研究之后,我开始更喜欢这个...我希望你们同意!!??

public class Canvas {

private int numberOfRows;
private int numberOfColumns;
private final List<Cell> listOfCells = new LinkedList<Cell>();

private Canvas() {
}

public static Canvas newInstance(ParsedCells seedPatternCells) {
    Canvas canvas = new Canvas();
    canvas.setNumberOfRowsAndColumnsBasedOnSeedPatten(seedPatternCells);
    canvas.drawBoundaries();
    canvas.placeSeedPatternCellsOnCanvas(seedPatternCells);
    return canvas;
}

最佳答案

构造函数包含重要代码通常不是一个好主意。通常,构造函数最多应将提供的值分配给字段。如果一个对象需要复杂的初始化,那么初始化应该由另一个类负责(通常是 factory )。请参阅 Miško Hevery 关于此主题的精彩文章:Flaw: Constructor does Real Work .

关于java - 像这样在构造函数中调用init方法是否违反了Clean Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5764689/

相关文章:

java - Java 中偶数索引位的求和

java - 仅比较两个实例之间的一个变量

c++ - 将创建多少个对象?

python - 单元测试包 Maven 风格约定

Kotlin 编码约定、中缀函数和按位运算

java - 如何检查字符串是否仅由字母和数字组成

java - Jena Fuseki 客户端

Java:向边框布局添加菜单栏

java - 通过输入 HashMap 值获取 HashMap key 无法按预期工作

C++,如果我需要它,我是否应该#include *和*它包含的其他东西?