Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java call constructor from constructor

I have a constructor

private Double mA;
private Double mB;

Foo(Double a) {
  mA = a;
  mB = a + 10;
}

Foo(Double a, Double b) {
  mA = a;
  mB = b;
  // some logic here
}

if I make a call to second constructor like this:

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}

than compiler tells me, that constructor should be the first statement. So do I need to copy all logic from the second constructor to first one?

like image 298
user1284151 Avatar asked Oct 14 '12 08:10

user1284151


2 Answers

Why don't you just do this(a, a+10) instead?

Note that this() or super() must be the first statement in a constructor, if present. You can, however, still do logic in the arguments. If you need to do complex logic, you can do it by calling a class method in an argument:

static double calculateArgument(double val) {
    return val + 10; // or some really complex logic
}

Foo(double a) {
    this(a, calculateArgument(a));
}

Foo(double a, double b) {
    mA = a;
    mB = b;
}
like image 177
nneonneo Avatar answered Nov 04 '22 13:11

nneonneo


If you use this() or super() call in your constructor to invoke the other constructor, it should always be the first statement in your constructor.

That is why your below code does not compile: -

Foo(Double a) {
  Double b = a + 10;
  this(a, b);
}

You can modify it to follow the above rule: -

Foo(Double a) {
  this(a, a + 10);  //This will work.
}
like image 6
Rohit Jain Avatar answered Nov 04 '22 14:11

Rohit Jain