我刚刚第一次遇到这种方法:使用返回自引用的方法而不是重载构造函数。考虑Selenium的FluentWait的样本用法:
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
方法withTimeout
,pollingEvery
和ignoring
均返回自引用。这似乎是一种绕过必须创建过多的重载构造函数的方法。例如,您需要2个 3 = 8个单独的重载构造函数定义,以允许初始化FluentWait
的实例,省略或包含3个输入参数,用于超时,轮询和忽略。通常,构造函数可以具有 n 可能的输入参数的类将需要 2 n 重载构造函数定义(如果每个可能的输入组合是需要的话)。使用方法似乎是获得相同功能的简略方法。为什么我不能一直这样做?哪种方案比另一方更好?
答案 0 :(得分:1)
构造函数允许创建实例final
的字段,这对于创建不可变对象很重要。您还可以将检查添加到构造函数中,该构造函数将验证字段的不变量。要结合使用此方法的灵活性和使用构造函数的好处,您可以使用构建器模式。
答案 1 :(得分:1)
这非常接近Builder pattern,请查看该模式何时适用的概述。
在这种情况下,您说FluentWait
会返回自我引用。它使对象变得可变。如果您有多线程或并行执行,这可能会有问题。
答案 2 :(得分:0)
重载构造函数和其他方法只是一种很好的方式,您可以更轻松地为自己和其他开发人员使用。图片显示您有add()
方法。如果您想在Java中同时接受2
和"2"
,则需要重载构造函数以接受String
和int
。
像这样:
public add(String number) {
...
}
public add(int number) {
...
}
答案 3 :(得分:0)
这似乎是一种绕过必须创建过度的方法 重载的构造函数。
事实上,由于每个被调用的方法都返回当前对象,因此它不在此处
javadoc明确指出。{
该对象在此处创建:new FluentWait<WebDriver>(driver)
这些是流利的调用 它避免了在每次需要在对象中设置内容时为变量添加前缀。
而不是写作:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver);
wait.setTimeout(30, SECONDS)
wait.pollingEvery(5, SECONDS)
wait.ignoring(NoSuchElementException.class);
你可以写:
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(30, SECONDS)
.pollingEvery(5, SECONDS)
.ignoring(NoSuchElementException.class);
还有一个流畅的构建器,它是一种以流畅和线程安全的方式实例化对象的方法,但这是另一回事。