скрытие API с интерфейсами в Java - PullRequest
2 голосов
/ 20 февраля 2011

Может кто-нибудь объяснить мне, что означает "скрытие API с интерфейсами в Java"? Как я могу использовать функции API с помощью интерфейсов? Мне понадобится небольшой рабочий пример, чтобы понять, как интерфейсы скрывают открытые части API, и как я могу одновременно использовать отдельные части API.

Заранее спасибо.

СПАСИБО, ПАРНИ, ЗА БЫСТРЫЙ ОТВЕТ ПОСЛЕДНИЙ, НО НЕ СПАСИБО ЗА ВАШЕ ВРЕМЯ И РАБОТУ!

II. Мой второй вопрос: что происходит на заднем плане в этом случае ниже?

IBinaryOperation op = BinaryOperationProvider.getOperation("multiply");

or 

List<String> myList = new LinkedList<String>();

Мне не понятно, потому что интерфейсы состоят из объявлений методов, поэтому я не понимаю, что могло бы произойти в приведенных выше строках. Есть ли смысл равенства между пустым методом используемых интерфейсов и объектов? Извините за мой слабый английский.

Ответы [ 4 ]

6 голосов
/ 20 февраля 2011

Например, вы можете объявить и создать список строк следующим образом:

List<String> myList = new LinkedList<String>();

Список - это тип myList. Это интерфейс. Это означает, что все последующие вызовы методов myList будут выполняться от до интерфейса: вы можете вызывать только методы, объявленные в интерфейсе List.

Однако конкретным классом объекта является LinkedList , который содержит больше методов, некоторые из которых отражают структуру связанного списка (например, addFirst и addLast). Но эти методы скрыты из-за способа, которым вы объявили переменную. Вы выбрали доступ к объекту через заданный (ограничительный) интерфейс.

Это может показаться ограничительным, но это также означает, что вы можете изменить свой код в любое время и заменить конкретный класс LinkedList любым другим классом, который реализует интерфейс List, например ArrayList .

2 голосов
/ 20 февраля 2011

Обычно, когда вы выставляете свой API, вы должны как можно больше скрывать детали реализации и раскрывать его через простые интерфейсы.

Например, Предположим, что вы даете API для добавления двух чисел.

Soln1 (Bad soln) Предоставить клиенту следующий класс

public class Adder {
    public void setA() {..}

    public void setB() {..}

    public int add() { return A + B; }  
}

Soln 2 (лучше soln): предоставить клиенту следующий интерфейс.

public interface Adder {
    public int add(int a, int b);

}

Теперь почему soln 2 - лучшее решение. Если бы вы дали пользователю первый солнц. Клиент привязан к классу Adder. Предположим, позже у вас будет новая реализация дополнения, которая может добавлять числа в облаке (чрезмерно воображаемо :)), вам, возможно, придется как клиенту изменить свой код, чтобы использовать новый класс.

Вместо этого, если вы просто дадите им интерфейс, вы можете обеспечить множество реализаций и иметь фабричный механизм для выбора подходящей реализации.

1 голос
/ 20 февраля 2011

Вот очень простой пример, использующий интерфейс:

public interface IBinaryOperation {
    public int performOp(int a, int b);
}

private class MultiplicationProvider implements IBinaryOperation {
    public int performOp(int a, int b) {
        return a * b;
    }
}

public class BinaryOperationProvider {
    static IBinaryOperation getOperation(String name) {
        if ("multiply".equals(name)) {
            return new MultiplicationProvider();
        } else if ("add".equals("name)) {
            return new AdditionProvider();
        } // ...
    }
}

Вы бы использовали это как:

IBinaryOperation op = BinaryOperationProvider.getOperation("multiply");
int c = op.performOp(a, b);

В приведенном выше примере MultiplicationProvider является полностью частной для реализации API. Единственная открытая часть - это интерфейс IBinaryOperation и класс BinaryOperationProvider.

0 голосов
/ 20 февраля 2011

Просто чтобы было ясно, что «скрыто» не API, а реализация.Большинству клиентов List (чтобы использовать приведенный выше пример) не нужно знать, какой тип List фактически используется.(Точно так же, как большинству клиентов TCP / IP не нужно ничего особенно знать о сети, которую они используют - просто он поддерживает стандартную абстракцию соединения.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...