以下两组代码的区别是什么

时间:2013-11-19 18:13:02

标签: java selenium

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

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

// 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();
}
} 

//第二个

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();
}
} 

3 个答案:

答案 0 :(得分:3)

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

  

Program to an interface, not to a concrete implementation

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

有关详细信息,请查看this answer。您还可以查看Effective Java,第52项 -

  

通过接口引用对象。

答案 1 :(得分:3)

Sayem是对的,但让我稍微介绍一下为什么这样做。

这允许我们称之为解耦。基本上,使用WebDriver的代码只关心它是一个webdriver,而不是Web驱动程序的实现。本质上,调用代码应该只关心WebDriver做什么,而不是HOW。

这种解耦或“关注点分离”的概念是OO的一个基本方面。谷歌可以提供大量关于这个主题的文章,这真的值得一读,因为它是优秀的Java和良好的OO编程的基础。

答案 2 :(得分:0)

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

如果你有:

FirefoxDriver driver = new FirefoxDriver();

如果有人要求您在Chrome或Internet Explorer上运行此测试,会发生什么?如果你编程到界面,你可以简单地这样做:

WebDriver driver = new FirefoxDriver();

WebDriver driver = new ChromeDriver();

WebDriver driver = new InternetExplorerDriver();

通过这种方式,您不会被卡住或限制为始终实现FirefoxDriver,您可以根据需要将其与接口的其他具体实现交换出来。