对象转换的设计模式和约定

Design patterns and conventions for object conversion

在对象转换方面,以下两种方法的首选方法是什么?

使用 asX() 方法进行对象转换

public class Foo {
  int foo;
  public Bar asBar() {
    return new Bar(foo);
  }
}

class Bar {
  int bar;
  public Bar(int bar) {
    this.bar = bar;
  }
}

使用构造函数进行对象转换

public class Foo {
  int foo;
}

class Bar {
  int bar;
  public Bar(int bar) {
    this.bar = bar;
  }

  public Bar(Foo foo) {
    this.bar = foo.foo;
  }

}

我不确定这两种方法(关于可维护性、可伸缩性 et.c)与另一种相比的优点。什么是既定标准?

正如 Paul Boddington 在评论中指出的那样,我承认这个问题非常广泛,但希望在这个问题结束之前进行一些有用的讨论。

我看到很多使用并且我个人喜欢的是很多 JDK 本身使用的样式,它涉及目标 class 中的静态工厂方法。最终目标是让代码易于阅读。

例如:

Integer.fromString("42")

从 OP 中的示例借出:

public class Foo {
  int foo;
}

class Bar {
  int bar;

  public static Bar fromFoo(Foo foo) {
    return new Bar(foo.foo);
  }

  public Bar(int bar) {
    this.bar = bar;
  }

}

这样就可以从 Foo 创建 Bar 并且代码在这样做时可读性很好:

Bar bar = Bar.fromFoo(foo);

它读起来几乎像英语,而不是 COBOL!