我有两个课程 第一个没有'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();
}
}
答案 0 :(得分:7)
使用界面,您可以在以后使用其他实现而无需更改所有代码。例如。如果你使用List接口,这可能是LinkedList,ArrayList,CopyOnWriteArrayList或其他东西。
你说得很清楚,实施的细节并不重要。
另一方面,我不会为每个班级制作一个界面。在大多数情况下,在不太可能发生的情况下,在您真正需要的时候添加界面并不总是很困难。
当你想要松散耦合时,我会使用一个接口,例如当调用者是另一个模块或由另一个开发人员使用时。如果你有像本地实现一样的紧耦合,我可能不会打扰接口。
在上面的示例中,您可能希望添加单元测试以查看设置了哪些值,或者开发人员可能希望使用Buffer来记录设置了哪些值。使用界面可以使这更容易。
答案 1 :(得分:2)
主要目的是 extensibility 。
目前,实施1似乎很好。但是,如果您以后决定以更有效的方式实现 buffer ,使用更少的内存使用来处理并发性,您可以随时更改它而不影响接口或合同此界面提供给您的其他类,或您团队中的其他开发人员或其他团队。
答案 2 :(得分:0)
您并不需要在那里使用界面,正如您所知道的那样。
使用界面有两大优势。 1)使用这种接口的不同实现要容易得多。 只要它是你班级的内部细节,它并不重要,但如果你决定让它从外部分配/继承这个类并改变行为,它就会很有用。 2)您只能使用该接口中的方法,因此它可以简化查找正确的方法(某些类有很多方法可以做“其他”)。如果实现是类有少量(公共)方法,并且它们都来自该接口,那么你显然什么也得不到。
它有缺点: 1)你没有看到方法不是来自界面(如果你需要tham,你不应该使用这个界面) 2)从使用它的代码来看,实现不太容易实现。
顺便说一句。您应该在java中编写规范约定(具有首字母大写的类/接口名称,例如。生产者而不是生产者)