传递接口引用或类引用之间是否有任何区别,如示例所示;
Interface MyInterface
{
void foo();
}
public class MyClass implements MyInterface
{
public void foo()
{
doJob();
}
}
....
//in another class or etc..
public void case1(MyClass mc)
{
mc.foo();
}
public void case2(MyInterface mi)
{
mi.foo();
}
....
//In somewhere
MyClass mc = new MyClass();
case1(mc);
case2(mc);
case1和case2之间的主要区别是什么?它们在性能,可见性,保护对象免受非法使用方面有任何优势吗?像这样使用它有什么缺点吗?
答案 0 :(得分:4)
通过传递接口,您将创建传递实现接口的所有类的机会。但在case1中,您只能传递MyClass
及其子类。
例如,考虑以下情况
public class YourClass implements MyInterface
{
public void foo()
{
doJob();
}
}
现在在case2中,您可以传递MyClass和YourClass的实例。但在案例1中你不能。
现在,它的重要性是什么?
在OOP中,建议编程到界面而不是类。因此,如果你考虑好的设计,就没有案例1。只有case2才能为你完成这项工作。
答案 1 :(得分:2)
唯一的好处是您通过使用接口MyInterface
隐藏了确切的实现,并且您可以在将来更改实现。
但是当你使用具体的类时,你就会受到那个类的行为的约束。
假设您在其他类的方法中传递List<Integer>
,那么它可以是用户不关心的列表的任何实现。但是,如果您通过ArrayList<Integer>
,则用户可以使用ArrayList
具体方法,以后您将无法将其更改为LinkedList
。
因此case2()
优于case1()
没有其他好处。
他们在性能,可见度方面是否有任何优势, 保护对象免受非法使用?
传递任何类型的引用时性能都是相同的,无论是接口还是具体的类引用都无关紧要。
编辑:根据评论和@maaartinus的进一步帖子,使用界面时性能似乎有些差异。但我再也不担心,除非它被证明是我的代码中的瓶颈,这将永远不会。