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?
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);
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With