Почему ты это делаешь? Вы пытаетесь избежать использования конструктора со многими аргументами (используя сеттеры, затем вызываете init), или вы избегаете иметь много конструкторов, которые имеют одинаковые аргументы? В этом случае вы можете использовать шаблон компоновщика.
public class Foo {
int a, b, c, d, e;
Foo(int a, int b, int c, int d, int e) { this.a=a; /*etc*/ }
}
public class FooBuilder {
int a,b,c,d,e;
FooBuilder A(int a) { this.a=a; return this;}
FooBuilder B(int b) { this.b=b; return this;}
//etc
Foo create(){ return new Foo(a,b,c,d,e);
}
Если это не сработает, я бы посоветовал изучить АОП. Я бы пометил методы, которые уже должны вызывать init (), уже с аннотацией [возможно, @requires ('init') или тому подобное) и заставил бы вашу AOP-инфраструктуру вставлять правильный код. Будьте внимательны, если у нескольких инициаторов нет побочных эффектов или вы правильно синхронизируете состояние has_init_been_called.