为什么重载构造函数而不是使用返回自引用的方法?

时间:2018-03-18 13:05:54

标签: java constructor-overloading

我刚刚第一次遇到这种方法:使用返回自引用的方法而不是重载构造函数。考虑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);

方法withTimeoutpollingEveryignoring均返回自引用。这似乎是一种绕过必须创建过多的重载构造函数的方法。例如,您需要2个 3 = 8个单独的重载构造函数定义,以允许初始化FluentWait的实例,省略或包含3个输入参数,用于超时,轮询和忽略。通常,构造函数可以具有 n 可能的输入参数的类将需要 2 n 重载构造函数定义(如果每个可能的输入组合是需要的话)。使用方法似乎是获得相同功能的简略方法。为什么我不能一直这样做?哪种方案比另一方更好?

4 个答案:

答案 0 :(得分:1)

构造函数允许创建实例final的字段,这对于创建不可变对象很重要。您还可以将检查添加到构造函数中,该构造函数将验证字段的不变量。要结合使用此方法的灵活性和使用构造函数的好处,您可以使用构建器模式。

答案 1 :(得分:1)

这非常接近Builder pattern,请查看该模式何时适用的概述。

在这种情况下,您说FluentWait会返回自我引用。它使对象变得可变。如果您有多线程或并行执行,这可能会有问题。

答案 2 :(得分:0)

重载构造函数和其他方法只是一种很好的方式,您可以更轻松地为自己和其他开发人员使用。图片显示您有add()方法。如果您想在Java中同时接受2"2",则需要重载构造函数以接受Stringint

像这样:

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

还有一个流畅的构建器,它是一种以流畅和线程安全的方式实例化对象的方法,但这是另一回事。