Ссылка на конструктор класса
Данная тема есть продолжением темы:
Содержание
- 1. Ссылки на конструкторы класса. Общая форма
- 2. Примеры использования ссылок на конструкторы класса
- Связанные темы
Поиск на других ресурсах:
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(). Это объясняется следующим правилом: если в классе не объявлен ни один конструктор, то компилятор создает неявный конструктор без параметров, который называется конструктором по умолчанию.
⇑
Связанные темы
- Ссылки на методы. Виды ссылок на методы. Ссылка на статический метод. Ссылка на метод экземпляра
- Конструкторы. Параметризированные конструкторы. Ключевое слово this. «Сборка мусора». Метод finalize(). Примеры
⇑