界面与具体类

时间:2011-04-14 22:58:39

标签: java

下面我有一个Person接口,一个实现类和一个驱动程序类,它使用一个名称初始化Person并再次输出它。使用

有什么好处
Person person = new PersonImpl();

而不是

PersonImpl person = new PersonImpl();

接口应该隐藏实现? 这是使用接口的正确方法吗?

public class Driver {

    public static void main(String [] args)
    {
        Person person = new PersonImpl();
        person.setName("test name");
        System.out.println("Name is "+person.getName());
    }

}


public interface Person {

    public void setName(String name);

    public String getName();

}


public class PersonImpl implements Person{

    private String name;

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

5 个答案:

答案 0 :(得分:12)

这是使用接口的方式。

原因是您可以在以后编写其他实现,而无需更改使用Person的代码。

现在您可以使用PersonImpl,但稍后您可能需要OtherTypeOfPersonImpl

您可以创建实现相同接口的新类,并且可以将新类与任何其他需要Person的代码一起使用。

一个很好的例子是List接口。

List有多种实现,例如ArrayListLinkedList等。每种实现都有优点和缺点。通过编写使用List的代码,您可以让每个开发人员确定哪种类型的List最适合他们,并且能够在不做任何更改的情况下处理其中的任何类型。

答案 1 :(得分:4)

你所做的是正确的。使用Person person = new PersonImpl()的优点是在接口和具体实现之间保持松耦合。 PersonImpl person = new PersonImpl()紧密耦合。并且Person person = new Person()甚至不会编译。

想象一下你有一个庞大的应用程序,很多代码依赖于PersonImpl对象。现在假设我要更改PersonImpl并创建一个新类PersonImpl2。现在我必须手动扫描整个项目并在各处进行更改。这甚至可能会破坏代码。这被称为紧耦合,是一件坏事。相反,如果代码的其余部分依赖于Person对象,那么即使我创建了一个新的PersonImpl2类,事情也会正常工作,因为PersonImpl2实现了Person。

答案 2 :(得分:2)

我能想到的一个优点是你可能有两种非常不同类型的人,但你想等到运行时(基于用户输入,配置文件等)来决定使用哪一种。你可以这样做:

Person person = null;
if ...
   person = new PersonImpl();
else 
   person = new PersonImpl2();

答案 3 :(得分:2)

这取决于你想如何使用Person。

就目前而言,拥有界面并不会带来任何实际好处。

然而,假设有外星人因为他们在Person中定义的行为(比如说“讲话(),行走(),思考(),感觉())而被视为”人“。现在你可能想要将“人”与“人”和“外星人”分开,以便来自两个非常不同的等级的人 - 比如说“哺乳动物”等级中的“人类”和“节肢动物”等级中的“外星人” - 都可以实现人员界面。

答案 4 :(得分:0)

使用界面而不是具体类可以让您稍后更改实现。

这是关于JDBC的,所有这些都基于接口,因此驱动程序可以在以后实现它。

例如,当您使用ResulSet时,您并不关心底层实现的方式或内容(使用Oracle驱动程序将类似于OracleResultSet,MySQL驱动程序可能类似于MySQLResultSet)但您知道可用的方法是什么供你使用。

与List或Map相同,而不是ArrayList或HashMap