Java接口的要求

时间:2011-09-13 06:53:10

标签: java oop interface

我有两个课程  第一个没有'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 个答案:

答案 0 :(得分:7)

使用界面,您可以在以后使用其他实现而无需更改所有代码。例如。如果你使用List接口,这可能是LinkedList,ArrayList,CopyOnWriteArrayList或其他东西。

你说得很清楚,实施的细节并不重要。

另一方面,我不会为每个班级制作一个界面。在大多数情况下,在不太可能发生的情况下,在您真正需要的时候添加界面并不总是很困难。

当你想要松散耦合时,我会使用一个接口,例如当调用者是另一个模块或由另一个开发人员使用时。如果你有像本地实现一样的紧耦合,我可能不会打扰接口。

在上面的示例中,您可能希望添加单元测试以查看设置了哪些值,或者开发人员可能希望使用Buffer来记录设置了哪些值。使用界面可以使这更容易。

答案 1 :(得分:2)

主要目的是 extensibility

目前,实施1似乎很好。但是,如果您以后决定以更有效的方式实现 buffer ,使用更少的内存使用来处理并发性,您可以随时更改它而不影响接口或合同此界面提供给您的其他类,或您团队中的其他开发人员或其他团队。

答案 2 :(得分:0)

您并不需要在那里使用界面,正如您所知道的那样。

使用界面有两大优势。 1)使用这种接口的不同实现要容易得多。 只要它是你班级的内部细节,它并不重要,但如果你决定让它从外部分配/继承这个类并改变行为,它就会很有用。 2)您只能使用该接口中的方法,因此它可以简化查找正确的方法(某些类有很多方法可以做“其他”)。如果实现是类有少量(公共)方法,并且它们都来自该接口,那么你显然什么也得不到。

它有缺点: 1)你没有看到方法不是来自界面(如果你需要tham,你不应该使用这个界面) 2)从使用它的代码来看,实现不太容易实现。

顺便说一句。您应该在java中编写规范约定(具有首字母大写的类/接口名称,例如。生产者而不是生产者)