下面我有一个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;
}
}
答案 0 :(得分:12)
这是使用接口的方式。
原因是您可以在以后编写其他实现,而无需更改使用Person
的代码。
现在您可以使用PersonImpl
,但稍后您可能需要OtherTypeOfPersonImpl
。
您可以创建实现相同接口的新类,并且可以将新类与任何其他需要Person
的代码一起使用。
一个很好的例子是List
接口。
List
有多种实现,例如ArrayList
,LinkedList
等。每种实现都有优点和缺点。通过编写使用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