Посилання на конструктор класу
Дана тема є продовженням теми:
Зміст
- 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(). Приклади
⇑