Construtor de chamada Java do construtor

Eu tenho um construtor

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 } 

se eu fizer uma chamada para o segundo construtor assim:

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

do que o compilador me diz, esse construtor deve ser a primeira instrução. Então eu preciso copiar toda a lógica do segundo construtor para o primeiro?

Por que você não faz this(a, a+10) ?

Note que this() ou super() deve ser a primeira instrução em um construtor, se presente. Você pode, no entanto, ainda fazer lógica nos argumentos. Se você precisa fazer lógica complexa, você pode fazer isso chamando um método de class em um argumento:

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

Se você usar this() chamada this() ou super() em seu construtor para invocar o outro construtor, essa deve ser sempre a primeira instrução em seu construtor.

É por isso que o código abaixo não compila:

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

Você pode modificá-lo para seguir a regra acima: –

 Foo(Double a) { this(a, a + 10); //This will work. } 

Invocação de outro construtor deve ser a primeira linha no construtor.

Você pode chamar a chamada de construtor explícito como –

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