Кастомные методы
Что такое кастомные методы, в частности в java? Например, кастомный метод добавления значения в List
Ответы (1 шт):
Кастомный метод (custom method) или же метод, определяемый пользователем (user-defined method) обозначает практически любой метод, создаваемый прикладным программистом (пользователем) с целью реализации требуемой функциональности, в отличие от методов, реализованных в самой Java (JDK), "стандартных" библиотеках / фреймворках, и, возможно, в виде бойлерплейтного кода в виде геттеров/сеттеров.
Если требуется разработать "кастомный метод добавления значения в List", для начала следует ознакомиться с интерфейсом java.util.List хотя бы для Java 8, и убедиться, что этот интерфейс предоставляет как минимум два метода для добавления значения:
boolean add(E e), унаследованный из интерфейсаCollection, который добавляет элемент в конец данного спискаvoid add(int index, E e), который вставляет элемент в заданную позициюindexв списке, сдвигая существующий элемент списка (если такой есть) и все последующие вправо на одну позицию.
Также есть пара соответствующих методов для добавления коллекций List::addAll(Collection<? extends E> c), List::addAll(int index, Collection<? extends E> c)
То есть, вроде бы уже есть всё готовое, и кастомизировать особо нечего.
Но предположим, что зачем-то понадобилось расширить существующий интерфейс, добавив некие синонимы для указанных методов append и insertAt. Тогда в новом интерфейсе можно сразу же предоставить реализации "новых" методов, используя дефолтные методы в интерфейсах:
import java.util.List;
public interface MyList<E> extends List<E> {
default void append(E e) {
add(e);
}
default void insertAt(int index, E e) {
add(index, e);
}
}
Однако, чтобы данные методы-синонимы можно было использовать в конкретных реализациях вроде ArrayList, потребуется также создать собственную реализацию, переопределив нужные конструкторы:
import java.util.*;
public class MyArrayList<E> extends ArrayList<E> implements MyList<E> {
public MyArrayList() { super();}
public MyArrayList(int capacity) { super(capacity);}
public MyArrayList(Collection<? extends E> c) { super(c);}
}
Использование:
MyList<String> myList = new MyArrayList<>(List.of("foo", "bar"));
myList.append("baz");
Другой пример кастомной реализации: добавление элементов в случайном порядке, тогда фактически будет переопределяться реализация существующего метода add в конкретном классе, которая также сведётся к вызову метода родительского класса:
import java.util.*;
public class RandomArrayList<E> extends ArrayList<E> {
private Random rand = new Random();
public RandomArrayList() { super();}
public RandomArrayList(int capacity) { super(capacity);}
public RandomArrayList(Collection<? extends E> c) {
super(c);
Collections.shuffle(this, rand);
}
@Override
public boolean add(E e) {
super.add(rand.nextInt(size()), e);
return true;
}
}