Интерфейс Appendable в Java
Разбираюсь в интерфейсе Appendable. Он, через класс AbstractStringBuilder, реализуется в StringBuilder (к примеру). Сам интерфейс Appendable выглядит так:
public interface Appendable {
Appendable append(CharSequence csq) throws IOException;
Appendable append(CharSequence csq, int start, int end) throws IOException;
Appendable append(char c) throws IOException;
}
На oracle написано, что интерфейс Appendable должен быть реализован любым классом, экземпляры которого предназначены для получения форматированного вывода из объекта Formatter. Но я не могу понять, что значит эти строчки в самом интерфейсе:
Appendable append
Это выглядит как конструктор. Метод append с типом Appendable. Но где этот тип, Appendable, тогда определен? Как это реализуется в Java?
Ответы (1 шт):
Вы уже смотрите на Appendable и в нем нет конструкторов, это интерфейс, там только 3 абстрактных метода и все.
Фокус заключается в возврате самого себя. Это часто используемая фича в программировании, вы можете встретиться с ней, например, при использовании паттерна билдер.
Давайте на простом примере (сначала без интерфейса) рассмотрим возврат самомого себя Создадим простой класс такого вида:
public class Test {
private String data;
public Test() {
this.data = "";
}
public Test add(String str) {
data += str;
return this;
}
@Override
public String toString() {
return data;
}
public static void main(String[] args) {
Test test = new Test()
.add("a")
.add("b")
.add("c");
System.out.println(test);
}
}
Если вы запустите этот код, то увидите в консоли abc Мой метод add, помимо того, что занимается конкатинацией строки переменной data со строкой, находящейся в аргументах этого метода, содержит строку кода return this Это занчаит что данный метод возвращает свой же экземпляр класса Это позволяет мне в методе Main писать так
Test test = new Test()
.add("a")
.add("b")
.add("c");
Фактически когда я создал экземпляр класса Test, каждый последующий вызов метода add после выполнения конкатенации этот экземпляр (класса test) мне и вернул, поэтому эту конструкцю можно разделить на множество строк:
Test test = new Test();
test = test.add("a")
test = test.add("b")
test = test.add("c");
А теперь, если мой класс будет имплементировать интерфейс (например, наш Appendable), то для реализации его метиодов append мне точно также нужно будет в каждом из них написать return this Таким образом мой метод по прежнему будет возвращать экземпляр класса Test, но теперь этот класс имплементирует Appendable, а между дочерним классом и родительским, как известно, отношение "is a", то есть Test теперь и есть Appendable.
Значит можно написать
Appendable appendable = new Test();
appendable = appendable.append("testString");
Или абсолютно тождественное, но проще в записи
Appendable appendable = new Test()
.append("testString");
Если есть вопросы - пишите