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

この特定のケースは、2つの値があるため少し厄介ですが、実行できるのは静的メソッドを呼び出すことです。

  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

別のオプションとして、String引数を取り、Fooのインスタンスを返す静的ファクトリメソッドがあると考えることができます。これは、 IntegerクラスのvalueOf(String s)メソッドで使用されるアプローチに似ています。

于 2010-03-04T03:49:52.550 に答える
1

両方のコンストラクターで必要な初期化を処理するメソッドを作成し、this(...)の代わりにそれを呼び出します。

于 2010-03-04T03:47:23.623 に答える