关于java:以下两组代码的区别是什么

What is the Difference in the below two set of code

我已经开始学习Java和Selphi了,我想了解下面两组代码之间的区别,它们都执行得很好并且具有相同的行为。

WebDriver是一个接口,由一个实现了所有方法的类FireFoxDriver实现。因此,为了调用FireFoxDriver中存在的方法,我们使用它的构造函数创建了一个firefox对象,但是为什么人们经常使用第一个(在下面的集合中)以及当我们使用类的构造函数来创建对象时它意味着什么,但是我们将接口名(类已经实现)放在了这个类名上,而不是放在了这个类名上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// First One

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;


public class FirstOne
{
public static void main(String[] args)
{
           WebDriver driver = new FirefoxDriver();  
       driver.get("http://google.com");
           System.out.println(driver.getTitle());
           driver.close();
}
}

/第二个

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;


public class FirstOne
{
public static void main(String[] args)
{

       FirefoxDriver driver = new FirefoxDriver();
           driver.get("http://google.com");
           System.out.println(driver.getTitle());
           driver.close();
}
}

Sayem是对的,但让我详细解释一下为什么要这样做。

这就允许我们所谓的脱钩。本质上,使用WebDriver的代码只关心它是一个WebDriver,而不是Web Driver的实现。本质上,调用代码应该只关心WebDriver做什么,而不是如何做。

这种脱钩或"分离关注点"的概念是OO的一个基本方面。谷歌可以在这方面吸引大量的文章,这真的值得一读,因为它是一个良好的Java和良好的面向对象编程的基础。


由于FirefoxDriver实现了WebDriver接口,所以可以使用WebDriver类型的引用来指向FirefoxDriver的实例。这基本上是为了遵循OOP原则,即-

Program to an interface, not to a concrete implementation.

使用第一种方法给了您很大的灵活性,这是程序员遵循的一种最佳实践。通过它们的interface引用对象,您可以稍后更改实现,而不会影响大部分现有代码。这种方法对于依赖注入等方面特别有用。

有关详细信息,请查看此答案。您还可以查看有效的Java,项目52。

Refer to objects by their interfaces.


作为一个应用面向对象设计原理的实际例子,如果你将程序编程到一个接口上,那么具体的实现就可以交换出来。

如果你有:

1
FirefoxDriver driver = new FirefoxDriver();

如果有人要求您在Chrome或Internet Explorer上运行此测试,会发生什么情况?如果您编程到接口,您可以简单地执行以下操作:

1
WebDriver driver = new FirefoxDriver();

1
WebDriver driver = new ChromeDriver();

1
WebDriver driver = new InternetExplorerDriver();

这样,您就不必一直执行FireFoxDriver,也不局限于始终执行FireFoxDriver,您可以根据需要将其与接口的其他具体实现交换。