如示例所示,传递接口参考或类参考之间是否有区别;
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之间的关键差异是什么?他们在性能,可见性和保护对象免受非法使用方面有任何优势吗?这样使用是否有缺点?
通过传递接口,您可以创建机会传递实现接口的所有类。但是在情况1中,您只能通过MyClass
及其子类。
例如,考虑以下情况
public class YourClass implements MyInterface
{
public void foo()
{
doJob();
}
}
现在,在案例2中,您可以通过myClass和your -Class的实例。但是在情况1中,您不能。
现在,它的重要性是什么?
在OOP中,建议将编程到接口而不是类。因此,如果您考虑良好的设计,就不会有case1。只有case2才能为您完成工作。
接口的程序
唯一的优势是您使用接口MyInterface
隐藏确切的实现,您可以在将来自由更改实现。
但是,当您使用具体类时,您就会与该类的行为绑定。
假设您正在以其他类的方法传递List<Integer>
,那么它可以是用户不在乎的列表的任何实现。但是,如果您通过ArrayList<Integer>
,则用户可以使用ArrayList
特定方法,并且将来您将无法将其更改为LinkedList
。
所以case2()
比case1()
没有其他好处。
他们在性能,可见性方面有任何优势 保护对象免受非法使用?
传递任何类型的参考时性能将是相同的,无论是接口还是具体类参考,都无关紧要。
编辑:根据@maaartinus的注释和进一步的帖子,使用接口时的性能似乎有所不同。但是,除非证明它是我的代码中的瓶颈,否则我再也不会担心。