Вопрос-ответ

How do I call one constructor from another in Java?

Как мне вызвать один конструктор из другого в Java?

Возможно ли вызвать конструктор из другого (внутри того же класса, а не из подкласса)? Если да, то каким образом? И какой может быть лучший способ вызвать другой конструктор (если есть несколько способов сделать это)?

Переведено автоматически
Ответ 1

Да, это возможно:

public class Foo {
private int x;

public Foo() {
this(1);
}

public Foo(int x) {
this.x = x;
}
}

Чтобы привязать к определенному конструктору суперкласса вместо конструктора того же класса, используйте super вместо this. Обратите внимание, что вы можете подключиться только к одному конструктору, и это должен быть первый оператор в теле вашего конструктора.

Смотрите также этот связанный вопрос, который касается C #, но где применяются те же принципы.

Ответ 2

Использование this(args). Предпочтительный шаблон - работать от самого маленького конструктора к самому большому.

public class Cons {

public Cons() {
// A no arguments constructor that sends default values to the largest
this(madeUpArg1Value,madeUpArg2Value,madeUpArg3Value);
}

public Cons(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
public Cons(int arg1, int arg2, int arg3) {
this.arg1 = arg1;
this.arg2 = arg2;
this.arg3 = arg3;
}
}

Вы также можете использовать более недавно предложенный подход valueOf или просто "of":

public class Cons {
public static Cons newCons(int arg1,...) {
// This function is commonly called valueOf, like Integer.valueOf(..)
// More recently called "of", like EnumSet.of(..)
Cons c = new Cons(...);
c.setArg1(....);
return c;
}
}

Чтобы вызвать суперкласс, используйте super(someValue). Вызов super должен быть первым вызовом в конструкторе, иначе вы получите ошибку компилятора.

Ответ 3

[Примечание: я просто хочу добавить один аспект, которого я не видел в других ответах: как преодолеть ограничения требования о том, что this() должно быть в первой строке).]

В Java другой конструктор того же класса может быть вызван из конструктора через this(). Однако обратите внимание, что this это должно быть в первой строке.

public class MyClass {

public MyClass(double argument1, double argument2) {
this(argument1, argument2, 0.0);
}

public MyClass(double argument1, double argument2, double argument3) {
this.argument1 = argument1;
this.argument2 = argument2;
this.argument3 = argument3;
}
}

То, что this должно отображаться в первой строке, выглядит как большое ограничение, но вы можете создавать аргументы других конструкторов с помощью статических методов. Например:

public class MyClass {

public MyClass(double argument1, double argument2) {
this(argument1, argument2, getDefaultArg3(argument1, argument2));
}

public MyClass(double argument1, double argument2, double argument3) {
this.argument1 = argument1;
this.argument2 = argument2;
this.argument3 = argument3;
}

private static double getDefaultArg3(double argument1, double argument2) {
double argument3 = 0;

// Calculate argument3 here if you like.

return argument3;

}

}
Ответ 4

Когда мне нужно вызвать другой конструктор изнутри кода (не в первой строке), я обычно использую вспомогательный метод, подобный этому:

class MyClass {
int field;


MyClass() {
init(0);
}
MyClass(int value) {
if (value<0) {
init(0);
}
else {
init(value);
}
}
void init(int x) {
field = x;
}
}

Но чаще всего я пытаюсь сделать это наоборот, вызывая более сложные конструкторы из более простых в первой строке, насколько это возможно. Для приведенного выше примера

class MyClass {
int field;

MyClass(int value) {
if (value<0)
field = 0;
else
field = value;
}
MyClass() {
this(0);
}
}
java