4

我想编写对 bean 友好的类。我观察到一种趋势(主要是使用 bean)将所需参数从构造函数移动到设置器(并init()在完成设置初始状态时使用方法)。

这个方法让我很担心,因为我希望我的类可以在没有 bean 基础结构的情况下使用,就像 Java 对象一样。正如我想象的那样,我必须在每个方法assert style中检查对象的正确状态。

上面的快速演示:

class A {
    public int x;
    public int y;
    private int sum;

    private boolean initialized = false;

    public void init() {
        sum = x + y;
        initialized = true;
    }

    private void initCheck() {
        if (!initialized) {
            throw new IllegalStateException("Uninitialized object.");
        }
    }

    public int getXMulSum() {
        initCheck();
        return x * sum;
    }

    public int getYMulSum() {
        initCheck();
        return y * sum;
    }

}

有更好的做法吗?

4

2 回答 2

3

鉴于您不想使用框架...

如果一个类在初始化之前不适合使用,我更喜欢使用构造函数。不要被博客和书籍所左右。构造函数就是为此目的。使用构造函数还消除了同步代码的任何要求。

我可以看到不使用构造函数的一个原因是,是否有很多初始化代码以及类外部的依赖项。如果太多的逻辑驻留在构造函数中,那么它会使您的应用程序变得脆弱并且难以从构造函数中的异常中恢复。在这种情况下,您可以选择使用工厂类来处理 bean 的实例化和初始化。这样,调用代码只会收到一个准备好并适合使用的 bean 。

一个很好的使用模式是Builder 模式,你有一个很长的构造函数参数列表。

“我观察到一种趋势(主要是使用 bean)将所需参数从构造函数移动到设置器”

这种可测试性的主要原因。如果您可以在不必初始化“昂贵”依赖项的情况下测试 bean 的特性,那么在构造函数中不包含它们是有好处的。话虽如此,我还要争辩说,如果这是一个问题,那么您的 bean 中可能有太多功能,最好将其分解。正如单一责任原则所建议的那样。

于 2014-04-07T12:10:18.047 回答
1

setter 比构造函数参数更通用,因为它们允许您处理循环依赖关系。

如果您没有循环依赖关系,我建议您使用构造函数参数,这正是为了加强依赖关系。

但是,如果可能的话,不要将任何逻辑放入构造函数中。正如布拉德所说,它使应用程序变得脆弱。在构造函数期间,整个 Spring 环境可能不可用。

尝试以允许构造函数简单地记住引用以供以后在实际方法中使用的方式进行设计。如果可以,请避免使用 init() 方法。

于 2014-04-07T15:18:33.697 回答