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

325
19 апреля 2017, 11:32

Есть два интерфейса:

public interface RobotConnection extends AutoCloseable {
    void moveRobotTo(int x, int y);
    @Override
    void close();
}

и

public interface RobotConnectionManager {
    RobotConnection getConnection();
}

Как можно объяснить наличие в интерфейсе RobotConnectionManager метода getConnection(), чей возвращаемый тип данных соответствует названию интерфейса RobotConnection?

Answer 1

Этот одна из возможных реализаций паттерна Фабричный метод. Это не классический вариант реализации, но довольно распространенный.

Класс реализующий интерфейс RobotConnectionManager позволяет создавать классы реализующие интерфейс RobotConnection. Таким образом вы можете полностью переделать процесс создания RobotConnection, не меня интерфейс.

Использоваться это может вот таким образом

RobotConnection.java

// добавлять public не надо
interface RobotConnection extends AutoCloseable {
    // описывать close не надо
    void moveRobotTo(int x, int y);
}

RobotConnectionManager.java

interface RobotConnectionManager {
    RobotConnection getConnection();
}

MoonRobotConnection.java

public class MoonRobotConnection implements RobotConnection {
    @Override
    public void close() throws Exception {}
    @Override
    public void moveRobotTo(int x, int y) {}
}

MoonRobotConnectionManager.java

public class MoonRobotConnectionManager implements RobotConnectionManager {
    @Override
    public RobotConnection getConnection() {
        MoonRobotConnection connection = new MoonRobotConnection();
        // тут может быть какой-то код
        return connection;
    }
}

Dispatcher.java

public class Dispatcher {
    public void doJob() {
        RobotConnectionManager manager = new MoonRobotConnectionManager();
        try(RobotConnection connection = manager.getConnection()) {
            connection.moveRobotTo(100, 100);
        } catch (Exception e) {}
    }
}

Вы можете вызвать метод doJob и передать ему любой объект, класс которого реализует интерфейс RobotConnectionManager. Ваш код получается "отвязанным" от конкретных классов.

// объект Dispatcher создан ранее и сохранен в переменной dispatcher
dispatcher.doJob(new MoonRobotConnectionManager());
Answer 2

Метод getConnection вернет вам объект класса, который унаследован от RobotConnection. Это будет выглядеть примерно так:

класс, реализующий этот интерфейс:

public class RobotConnectionManagerImpl implements RobotConnectionManager {
...
}

и вызов метода вернет например объект этого класса

RobotConnectionManager rcm = new RobotConnectionManagerImpl();
RobotConnection rc = rcm.getConnection();
READ ALSO
парсить вложенные объекты JSON на java

парсить вложенные объекты JSON на java

Добрый деньИмеется ответ от сайта в формате JSON вида:

332
В чем ошибка в коде многопоточного сервера?

В чем ошибка в коде многопоточного сервера?

Код при запуске потоков-соединений (подсоединении клиентов) выдаёт ошибку "IOExceptionRunnable"Буду признателен любой подсказке

249
Проблема с закрытием курсора

Проблема с закрытием курсора

После этого в ListView передается курсор и на нем отображается содержимое курсора, но, если я закрываю курсор в конце, то в приложении выходит...

223
SOAP сервис и парсер [требует правки]

SOAP сервис и парсер [требует правки]

Я использую сервер tomcat и деплою на него мое grails приложениеУ меня не получилось найти нормальное решение на groovy (все плагины не работают, а разбираться...

302