Во-первых, пожалуйста, не надо.
Во-вторых, действительно, это действительно плохая идея. Не. Подумайте о том, что вы пытаетесь сделать в более широком контексте.
Если вам абсолютно необходимо это сделать, вы можете спрятать его в ThreadLocal
. Вы можете вызвать (неэкземплярный) метод, оценивая выражение, результат которого передается в super()
или this()
(возможно, это единственная причина, по которой вам нужен второй частный конструктор, который, возможно, принимает Void
( «V» (аргумент). Это так плохо, я даже не собираюсь записывать код.
В отредактированном примере кода просто передайте наборы в защищенный конструктор. Если у вас много аргументов, возможно, некоторые подклассы являются особыми для некоторых аргументов, вы можете заключить все аргументы в один объект аргумента.
Существует еще один действительно хакерский подход, если у вас есть -target 1.4
или более поздняя версия (что вам следует делать!). Сделайте подкласс внутренним классом (возможно, анонимным). Ссылки на внешние this и другие захваченные переменные доступны перед вызовом супер-конструктора.
public class Outer {
// What a hack!
private static abstract class Base {
Base() {
hello(); // Calling a virtual method in a constructor - poor form.
}
abstract void hello();
}
public static void main(String[] args) {
// Do not do this.
final String hi = "Hi!";
new Base() {
void hello() {
// Really, don't do it.
System.err.println(hi);
}
};
}
}