首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java成员初始化模式

Java成员初始化模式
EN

Stack Overflow用户
提问于 2010-07-06 13:55:27
回答 7查看 1.5K关注 0票数 3

我有一个MyClass类:

代码语言:javascript
复制
public class MyClass {
  private MyComplexType member1;
}

我必须在member1上做一些非常密集的初始化。足够方便地证明自己的方法是从MyClass构造函数调用的。

我的问题是,以下哪种格式最适合这种方法?

代码语言:javascript
复制
private MyComplexType initMyComplexType() { 
  MyComplexType result = new MyComplexType();  
  // extensive initialization on result...
  return result;
}

像这样叫:

代码语言:javascript
复制
public MyClass() {
  member1 = initMember1();
}

代码语言:javascript
复制
private void initMember1() {
  member1 = new MyComplexType();
  // extensive initialization on member1...
}

像这样叫:

代码语言:javascript
复制
public MyClass() {
  initMember1();
}

对于私有成员来说,哪种样式更好?为什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-07-06 13:57:33

我将选择第一个选项,因为它更清楚地表达了init方法的用途,并显式地显示了数据流。

更不用说它使init方法中的代码具有潜在的可重用性。如果以后需要初始化另一个变量,则只需再次调用该方法,而不必担心副作用。此外,如果该其他变量位于另一个类中,则可以轻松地将该方法移动到两个位置都可访问的地方。

沿着这条路线,我还会考虑将init方法保留在类似doExtensiveComplexCalculation的东西上,以便将它从实际的成员变量中解耦。

票数 6
EN

Stack Overflow用户

发布于 2010-07-06 14:33:43

第二种方法的另一个缺点是字段member1可能将部分初始化的MyComplexType公开给另一个线程。

针对J rn Horstmann的重写保护静态方法的示例:

代码语言:javascript
复制
public class StaticOverrideParent {

 protected static void doSomething() {
  System.out.println("Parent doing something");
 }
}

public class StaticNoOverride extends StaticOverrideParent {

 public static void main(String[] args) {
  doSomething();
 }
}

public class StaticOverride extends StaticOverrideParent {

 protected static void doSomething() {
  System.out.println("Doing something");
 }

 public static void main(String[] args) {
  doSomething();
 }
}

运行StaticNoOverride会打印“父级做某事”。运行StaticOverride会打印“做某事”。

票数 4
EN

Stack Overflow用户

发布于 2010-07-06 14:05:24

选择1.除了Peter提到的原因之外,这是一个更好的实践,因为这样您就有了一个计算密集型但无副作用的函数init(),以及打火机但状态修改构造函数。将这两个特性分开是公认的良好实践。

另外,使用模板/工厂方法是为扩展打开的。在子类中更容易覆盖它(如果使用模板方法,则覆盖它的部分)。同样,这要感谢计算和状态修改的分离。

编辑:正如其他人所说的,还可以考虑将initComplexMember()重命名为buildContextMember()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3186806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档