27

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

20

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

4 ответ(ов)

2

В 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() на первой строке.

0

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

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);
   }
}

Использование вызова другого конструктора на первой строке делает код более читаемым и понятным, так как вы сразу видите, как разные конструкторы связаны друг с другом.

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;
    }
}

Этот класс содержит набор конструкторов. Каждый конструктор инициализирует некоторые или все переменные-члены прямоугольника.

0

В языке программирования Java с помощью ключевого слова this мы можем вызывать один конструктор из другого в пределах одного и того же класса.

Пример:

public class Example {

    private String name;

    public Example() {
        this("Mahesh"); // вызываем конструктор с параметром, передавая строку "Mahesh"
    }

    public Example(String name) {
        this.name = name; // инициализация поля name
    }

}

В этом примере, когда создается объект класса Example без параметров, вызывается конструктор по умолчанию, который в свою очередь вызывает другой конструктор, передавая строку "Mahesh". Это позволяет избежать дублирования кода и упростить инициализацию.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь