How do I call one constructor from another in Java?
Как мне вызвать один конструктор из другого в Java?
Возможно ли вызвать конструктор из другого (внутри того же класса, а не из подкласса)? Если да, то каким образом? И какой может быть лучший способ вызвать другой конструктор (если есть несколько способов сделать это)?
Переведено автоматически
Ответ 1
Да, это возможно:
publicclassFoo { privateint x;
publicFoo() { this(1); }
publicFoo(int x) { this.x = x; } }
Чтобы привязать к определенному конструктору суперкласса вместо конструктора того же класса, используйте super вместо this. Обратите внимание, что вы можете подключиться только к одному конструктору, и это должен быть первый оператор в теле вашего конструктора.
Смотрите также этот связанный вопрос, который касается C #, но где применяются те же принципы.
Ответ 2
Использование this(args). Предпочтительный шаблон - работать от самого маленького конструктора к самому большому.
publicclassCons {
publicCons() { // A no arguments constructor that sends default values to the largest this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value); }
publicCons(int arg1, int arg2) { // An example of a partial constructor that uses the passed in arguments // and sends a hidden default value to the largest this(arg1,arg2, madeUpArg3Value); }
// Largest constructor that does the work publicCons(int arg1, int arg2, int arg3) { this.arg1 = arg1; this.arg2 = arg2; this.arg3 = arg3; } }
Вы также можете использовать более недавно предложенный подход valueOf или просто "of":
publicclassCons { publicstatic Cons newCons(int arg1,...) { // This function is commonly called valueOf, like Integer.valueOf(..) // More recently called "of", like EnumSet.of(..) Consc=newCons(...); c.setArg1(....); return c; } }
Чтобы вызвать суперкласс, используйте super(someValue). Вызов super должен быть первым вызовом в конструкторе, иначе вы получите ошибку компилятора.
Ответ 3
[Примечание: я просто хочу добавить один аспект, которого я не видел в других ответах: как преодолеть ограничения требования о том, что this() должно быть в первой строке).]
В Java другой конструктор того же класса может быть вызван из конструктора через this(). Однако обратите внимание, что this это должно быть в первой строке.
То, что this должно отображаться в первой строке, выглядит как большое ограничение, но вы можете создавать аргументы других конструкторов с помощью статических методов. Например:
Но чаще всего я пытаюсь сделать это наоборот, вызывая более сложные конструкторы из более простых в первой строке, насколько это возможно. Для приведенного выше примера
classMyClass { int field;
MyClass(int value) { if (value<0) field = 0; else field = value; } MyClass() { this(0); } }