我已经开始学习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();
}
}
答案 0 :(得分:3)
由于FirefoxDriver
实现了WebDriver
接口,因此您可以使用WebDriver
类型的引用来指向FirefoxDriver
的实例。这基本上是为了遵循OOP原则,即 -
使用第一种方法为您提供了很大的灵活性,这是程序员遵循的最佳实践。通过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,您可以根据需要将其与接口的其他具体实现交换出来。