将基于字符串的构造函数添加到Java类的最佳方法?

时间:2010-03-04 03:39:56

标签: java constructor tostring

说我有一些课,例如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)之前不允许语句。是否有一些可接受的解决方法?

3 个答案:

答案 0 :(得分: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);
  }

答案 1 :(得分:4)

Anothe选项是,您可以考虑使用一个静态工厂方法,它接受一个String参数并返回一个Foo实例。这类似于Integer类中 valueOf(String s)方法所使用的方法。

答案 2 :(得分:1)

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