制作一个单独的构造函数和 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()
中工作。
如问题所述,创建这样的构造函数和初始值设定项是否更好(伪代码):
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()
中工作。