制作一个单独的构造函数和 init 方法更好,还是创建一个带参数的构造函数更好?

Is it better to make a separate constructor and init method, or to create a constructors with parameters?

如问题所述,创建这样的构造函数和初始值设定项是否更好(伪代码):

public Component()  
{
    this.arrayList = new ArrayList<String>();
}

public void initialize()  
{  
    this.value = parse(this.xml);
    arrayList.add(value);
}

在我的例子中,初始化必须从 xml 文档中读取并解析值。 class 还会有许多其他成员,这些成员将使用单独的、更复杂的方法进行初始化。这种情况下的最佳做法是什么?

抱歉,这个问题没有单一的答案。编码标准多种多样。例如,会有标准给出指导方针,例如

  • 方法不会太长。
  • 方法不太复杂。
  • 要组合在一起的重载方法。

换句话说:如果您认为您的构造函数变得太长且难以阅读,那么请随意将其功能拆分为多个方法。

init() 方法相对于构造函数的一个优势是它可以 return 一个值,这可能对您的应用程序的目的有用。另一方面,您可以在构造函数中抛出异常以实现类似的效果,然后调用构造函数的方法会捕获(并适当处理)此异常。

尝试在 Internet 上搜索编码标准,您会发现许多关于此主题的有趣讨论。

在构造函数内部进行初始化工作的一个明显优势是 class 的用户不需要显式调用 init 方法,并且它避免了与未完全初始化的对象相关的问题。如果您需要用其他一些 class 扩展您的 class,您的初始化相关代码将被适当地调用。

我认为你可以做的是,有一个 init 方法来处理 private/protected 范围内的所有初始化相关代码,然后根据不同的场景从不同的构造函数调用这个方法。

复杂初始化有构建器模式

X x = X.create()
    .setA(4)
    .setB("b")
    .end();

class X {
    private X() { }

    public static XBuilder create() {
    }

    public static class XBuilder {
        private X x;

        X end() {
            return x;
        }

        XBuilder setA(int a) {
            x.setA(a);
            return this;
        }
        XBuilder setB(String b) {
            x.setB(b);
            return this;
        }
    }

它使用流畅的界面、链式调用,可用于检查完整的初始化,在 end() 中工作。