Требование интерфейса Java - PullRequest
       2

Требование интерфейса Java

4 голосов
/ 13 сентября 2011

У меня есть две программы.
Первая из них без интерфейса 'Buffer', а вторая с интерфейсом 'Buffer'.
Обе программы выдают мне один и тот же вывод.
У меня вопрос.
почему янужно создать интерфейс "Буфер", в то время как я могу получить тот же вывод без интерфейса?
Вот мои обе программы:

Без интерфейса:

public class MainClass {

    public static class producer {

        maintainBuffer bf;

        producer(maintainBuffer buffer) {
            this.bf = buffer;
        }

        public void setData() {
            for (int i = 0; i <= 10; i++) {
                bf.set(i);
            }
        }
    }

    public static class reader {

        maintainBuffer bf;

        reader(maintainBuffer buffer) {
            this.bf = buffer;
        }

        public void getData() {
            System.out.println("From Reader Class:-" + bf.get());

        }

        public void extraData() {
            System.out.println("Extra DATA");
        }
    }

    public static class maintainBuffer {

        int buffer = -1;

        public int get() {
            return buffer;
        }

        public void set(int a) {
            buffer += a;
        }
    }

    public static void main(String str[]) {
        maintainBuffer b = new maintainBuffer();
        producer p = new producer(b);
        p.setData();
        reader r = new reader(b);
        r.getData();
        r.extraData();
    }
}

с интерфейсом

public class MainClass {

    public static class producer {

        Buffer bf;

        producer(Buffer buffer) {
            this.bf = buffer;
        }

        public void setData() {
            for (int i = 0; i <= 10; i++) {
                bf.set(i);
            }
        }
    }

    public static class reader {

       Buffer bf;

        reader(Buffer buffer) {
            this.bf = buffer;
        }

        public void getData() {
            System.out.println("From Reader Class:-" + bf.get());

        }

        public void extraData() {
            System.out.println("Extra DATA");
        }
    }


 public static interface Buffer{
       public int get();
       public void set(int a);
   }


  static class maintainBuffer implements Buffer{
      int buffer=-1;

        public int get() {
         return buffer;
        }

        public void set(int a) {
           buffer +=a;
        }
  }
    public static void main(String str[]) {
        Buffer b = new maintainBuffer();
        producer p = new producer(b);
        p.setData();
        reader r = new reader(b);
        r.getData();
        r.extraData();

    }
}

Ответы [ 3 ]

7 голосов
/ 13 сентября 2011

С интерфейсом вы можете использовать другие реализации позже, не меняя весь ваш код.Например, если вы используете интерфейс List, это может быть LinkedList, ArrayList, CopyOnWriteArrayList или что-то еще.

Вы делаете это ясно, детали реализации не важны.

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

Я бы использовал интерфейс, если вы хотите слабой связи, например, когда вызывающий абонент является другим модулем или используетсядругой разработчик.Если у вас тесная связь, как у локальной реализации пакета, я не буду беспокоиться об интерфейсе.

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

2 голосов
/ 13 сентября 2011

Основной целью является расширяемость .

На данный момент реализация 1 кажется хорошей.Однако, если позже вы решите внедрить буфер более эффективным способом, с меньшим использованием памяти, которое обрабатывает параллелизм, вы всегда можете изменить это, не затрагивая интерфейс или контракт, который этот интерфейспредоставляет другим вашим классам, ИЛИ другим разработчикам в вашей команде ИЛИ другим командам.

0 голосов
/ 13 сентября 2011

Вам точно не нужно использовать интерфейс, как вы уже знаете.

Использование интерфейса имеет 2 больших преимущества. 1) Гораздо проще использовать различную реализацию такого интерфейса. Пока он находится внутри деталей вашего класса, это не важно, но если вы решите сделать его присваиваемым извне / наследовать этот класс и изменить поведение, это может быть полезно. 2) Вы можете использовать метод только из этого интерфейса, так что это может упростить поиск правильного метода (в НЕКОТОРЫХ классах есть много методов, которые делают «что-то еще»). Если в реализации класса есть несколько (общедоступных) методов и все они из этого интерфейса, вы, очевидно, ничего не получите.

И у него есть недостатки: 1) вы не видите метод не из интерфейса (если вам нужен tham, вы не должны использовать этот интерфейс) 2) из ​​кода, использующего его, не так легко добраться до реальной реализации.

кстати. Вы должны написать соглашения о соответствии на языке Java (имена классов / интерфейсов с заглавной буквы, например, «Производитель вместо производителя»)

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