Интерфейс Appendable в Java

Рейтинг: 1Ответов: 1Опубликовано: 10.08.2025

Разбираюсь в интерфейсе 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?

Ответы

▲ 3

Вы уже смотрите на 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");

Если есть вопросы - пишите