Как вызвать один конструктор из другого в Java?
Можно ли вызвать конструктор из другого конструктора в рамках одного класса (без использования подкласса)? Если да, то как это сделать? Каков наилучший способ выполнить вызов другого конструктора (если существует несколько способов)?
4 ответ(ов)
В 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;
// Здесь можно вычислить значение argument3 по желанию.
return argument3;
}
}
Таким образом, вы можете эффективно использовать статические методы для динамического вычисления значений аргументов, что позволяет вам сохранять чистоту кода и избегать ограничений вызова this()
на первой строке.
Когда мне нужно вызвать другой конструктор из кода (не на первой строке), я обычно использую вспомогательный метод, как в следующем примере:
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);
}
}
Использование вызова другого конструктора на первой строке делает код более читаемым и понятным, так как вы сразу видите, как разные конструкторы связаны друг с другом.
Внутри конструктора вы можете использовать ключевое слово this
, чтобы вызвать другой конструктор в том же классе. Это называется явным вызовом конструктора.
Рассмотрим другой класс Rectangle с отличной реализацией от той, что показана в разделе «Объекты»:
public class Rectangle {
private int x, y;
private int width, height;
public Rectangle() {
this(1, 1);
}
public Rectangle(int width, int height) {
this(0, 0, width, height);
}
public Rectangle(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
}
Этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.
В языке программирования Java с помощью ключевого слова this
мы можем вызывать один конструктор из другого в пределах одного и того же класса.
Пример:
public class Example {
private String name;
public Example() {
this("Mahesh"); // вызываем конструктор с параметром, передавая строку "Mahesh"
}
public Example(String name) {
this.name = name; // инициализация поля name
}
}
В этом примере, когда создается объект класса Example
без параметров, вызывается конструктор по умолчанию, который в свою очередь вызывает другой конструктор, передавая строку "Mahesh". Это позволяет избежать дублирования кода и упростить инициализацию.
Как инициализировать значения HashSet при создании?
Инициализация ArrayList в одну строчку
Что значит "Не удалось найти или загрузить основной класс"?
Что значит 'synchronized'?
Имеют ли круглые скобки после имени типа значение при использовании new?