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(). Это объясняется следующим правилом: если в классе не объявлен ни один конструктор, то компилятор создает неявный конструктор без параметров, который называется конструктором по умолчанию.

 


Связанные темы