Java. Посилання на конструктори класу




Посилання на конструктор класу

Дана тема є продовженням теми:


Зміст


Пошук на інших ресурсах:

1. Посилання на конструктор класу. Загальна форма

Механізм лямбда-виразів може використовуватись для конструкторів класу. Посилання на конструктори створюються таким самим чином як і посилання на методи.

Загальна форма синтаксису оголошення посилання на конструктор має вигляд

ім’я_класу::new

Посилання на конструктор може бути присвоєне посиланню на функціональний інтерфейс при умові, що сигнатура конструктора сумісна з сигнатурою методу функціонального інтерфейсу.

 

2. Приклади використання посилань на конструктори класу
2.1. Посилання на конструктор класу. Клас реалізує трикутник за його сторонами

У прикладі продемонстровано використання посилання на конструктор класу Triangle, який реалізує трикутник за його сторонами.

// Клас, що реалізує трикутник за його сторонами
class Triangle {
  private double a, b, c;

  // Конструктор
  public Triangle(double a, double b, double c) {
    this.a = a; this.b = b; this.c = c;
  }

  // Методи доступу
  public double GetA() { return a; }
  public double GetB() { return b; }
  public double GetC() { return c; }

  // Метод друку значень полів
  public void Print(String text) {
    System.out.println(text);
    System.out.println("a = " + a + ", b = " + b + ", c = " + c);
  }
}

// Функціональний інтерфейс для класу трикутника
interface IFunction {
  // Сигнатура співпадає з сигнатурою конструктора класу Triangle
  Triangle Function(double a, double b, double c);
}

public class DemoRefMethod {

  public static void main(String[] args) {
    // 1. Оголосити посилання на функціональний інтерфейс
    IFunction ref;

    // 2. Присвоїти посиланню значення конструктора
    ref = Triangle::new;

    // 3. Створити екземпляр класу Triangle
    Triangle tr = ref.Function(5, 4, 5);
    tr.Print("tr:");
  }
}

У вищенаведеному коді в рядку

ref = Triangle::new;

посиланню ref на функціональний інтерфейс присвоюється значення конструктора класу Triangle. Маючи посилання на конструктор можна створити екземпляр класу Triangle шляхом виклику методу Function() інтерфейсу IFunction як показано нижче

Triangle tr = ref.Function(5, 4, 5);

Результат роботи програми

tr:
a = 5.0, b = 4.0, c = 5.0

 

2.2. Посилання на конструктор узагальненого (шаблонного) класу

Умова задачі. Реалізувати шаблонний клас Array<T>, який містить методи оперування масивом даних:

  • обчислення суми елементів масиву;
  • обчислення максимального елементу в масиві.

Продемонструвати використання посилання на конструктор класу для створення екземпляру класу Array<T>.

Розв’язок.

// Шаблонний клас, що містить методи оперування масивом даних типу T
class Array<T extends Number> {

  // Конструктор класу без параметрів
  Array() {
  }

  // Метод обчислення суми елементів масиву
  Double Sum(T[] A) {
    Double sum = 0.0;
    for (int i=0; i<A.length; i++)
      sum += A[i].doubleValue();
    return sum;
  }

  // Метод обчислення максимального елементу в масиві
  Double Max(T[] A) {
    Double max = A[0].doubleValue();
    for (int i=1; i<A.length; i++)
      if (max<A[i].doubleValue())
        max = A[i].doubleValue();
    return max;
  }
}

// 2. Узагальнений функціональний інтерфейс,
// призначений для роботи з класом Array
interface IFunction<T extends Number> {
  // Сигнатура цього методу повинна співпадати
  // з сигнатурою конструктора класу Array<T>
  Array<T> Function();
}

public class DemoRefMethod {

  public static void main(String[] args) {
    // Демонстрація використання посилання на конструктор класу Array<T>
    // 1. Для типу Integer
    // 1.1. Оголосити посилання на функціональний інтерфейс IFunction<T>
    IFunction<Integer> refInt;

    // 1.2. Присвоїти посиланню значення конструктора
    refInt = Array::new;

    // 1.3. Створити екземпляр класу Array<T> з використанням конструктора
    // з прив'язкою до типу Integer
    Array<Integer> objInt = refInt.Function();

    // 1.4. Тестувальний масив
    Integer[] AI = { 1, 3, 7 };

    // 1.5. Обчислити суму для масиву AI
    Double sum = objInt.Sum(AI);
    System.out.println("sum = " + sum); // sum = 11.0

    // 2. Прив'язка до типу Float
    // 2.1. Створити екземпляр класу Array<T> з прив'язкою до типу Float
    IFunction<Float> refFloat = Array::new;

    // 2.2. Створити екземпляр класу Array<T> для типу Float
    Array<Float> objFloat = refFloat.Function();

    // 2.3. Тестувальний масив
    Float[] AF = { 1.8f, -2.5f, 3.4f, 2.9f, 1.7f };

    // 2.4. Обчислити максимальне значення
    Double max = objFloat.Max(AF);
    System.out.println("max = " + max); // max = 3.4000000953674316
  }
}

У вищенаведеному коді для доступу до конструктора класу Array<T> використовується виклик

Array::new

У класі Array<T> необов’язково оголошувати конструктор без параметрів Array(). Це пояснюється наступним правилом: якщо в класі не оголошено жодного конструктора, то компілятор створює неявний конструктор без параметрів, який називається конструктором за замовчуванням.

 


Зв’язані теми