4

假设我有一些课程,例如 Foo:

public class Foo {
    private Integer x;
    private Integer y;

    public Foo(Integer x, Integer y) {
        this.x = x;
        this.y = y;
    }


    public String toString() {
        return x + " " + y;
    }
}

现在,我希望添加一个构造函数,它的参数是一个表示 Foo 的字符串,例如 Foo("1 2") 将构造一个 x=1 和 y=2 的 Foo。由于我不想复制原始构造函数中的逻辑,因此我希望能够执行以下操作:

public Foo(string stringRepresentation) {
    Integer x;
    Integer y;

    // ...
    // Process the string here to get the values of x and y.
    // ...

    this(x, y);
}

但是,Java 不允许在调用 this(x, y) 之前使用语句。有一些公认的解决方法吗?

4

3 回答 3

10

由于这两个值,这种特殊情况有点尴尬,但是您可以做的是调用静态方法。

  public Foo(Integer x, Integer y) {
      this(new Integer[]{x, y});
  }

  public Foo(String xy) {
      this(convertStringToIntegers(xy));
  }

  private Foo(Integer[] xy) {
      this.x = xy[0];
      this.y = xy[1];
  }

  private static Integer[] convertStringToIntegers(String xy) {
      Integer[] result;
      //Do what you have to do...
      return result;
  }

话虽这么说,如果这个类不需要被子类化,那么让构造函数全部私有并拥有一个公共静态工厂方法会更清晰、更好、更符合规范:

  public static Foo createFoo(String xy) {
       Integer x;
       Integer y;
        //etc.
        return new Foo(x, y);
  }
于 2010-03-04T03:45:46.790 回答
4

另一种选择是,您可以考虑拥有一个静态工厂方法,该方法接受一个字符串参数并返回一个 Foo 实例。这类似于Integer类中valueOf(String s)方法使用的方法。

于 2010-03-04T03:49:52.550 回答
1

创建一个方法来处理两个构造函数中所需的初始化并调用它而不是 this(...)。

于 2010-03-04T03:47:23.623 回答