Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to add a string based constructor to a Java class?

Say I have some class, e.g. 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;
    }
}

Now, I wish to add a constructor which takes as its argument a string representing a Foo, e.g. Foo("1 2") would construct a Foo with x=1 and y=2. Since I don't want to duplicate the logic in the original constructor, I would like to be able to do something like this:

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

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

    this(x, y);
}

However, Java does not allow statements before the call to this(x, y). Is there some accepted way of working around this?

like image 974
verdesmarald Avatar asked Dec 07 '22 04:12

verdesmarald


2 Answers

This particular case is kind of awkward because of the two values, but what you can do is call a static method.

  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;
  }

That being said, if this class doesn't need to be subclassed, it would be clearer and better and more idomatic to leave the constructors all private and have a public static factory method:

  public static Foo createFoo(String xy) {
       Integer x;
       Integer y;
        //etc.
        return new Foo(x, y);
  }
like image 144
Yishai Avatar answered Jan 13 '23 12:01

Yishai


Anothe option would be, you can think of having a static factory method that takes a String argument and returns an instance of Foo. This is similar to the approach used by valueOf(String s) method in Integer class.

like image 45
sateesh Avatar answered Jan 13 '23 12:01

sateesh