在Java中传递接口参考和类参考之间的差异



如示例所示,传递接口参考或类参考之间是否有区别;

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的注释和进一步的帖子,使用接口时的性能似乎有所不同。但是,除非证明它是我的代码中的瓶颈,否则我再也不会担心。

最新更新