Лучший способ добавить строковый конструктор в класс Java? - PullRequest
4 голосов
/ 04 марта 2010

Скажем, у меня есть класс, например 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") построит Foo с x = 1 и y = 2. Поскольку я не хочу дублировать логику в исходном конструкторе, я хотел бы иметь возможность сделать что-то вроде этого:

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 ]

10 голосов
/ 04 марта 2010

Этот конкретный случай довольно неудобен из-за двух значений, но вы можете вызвать статический метод.

  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);
  }
4 голосов
/ 04 марта 2010

Другой вариант: вы можете подумать о наличии статического метода фабрики, который принимает аргумент String и возвращает экземпляр Foo. Это похоже на подход, используемый методом valueOf (String s) в Integer классе.

1 голос
/ 04 марта 2010

Создайте метод, который позаботится об инициализации, необходимой для обоих конструкторов, и вызовите ее вместо этого (...).

...