Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么要重载构造函数而不是使用返回自引用的方法?_Java_Constructor Overloading - Fatal编程技术网

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

Java 为什么要重载构造函数而不是使用返回自引用的方法?,java,constructor-overloading,Java,Constructor Overloading,我第一次遇到这种方法:使用返回自引用的方法,而不是重载构造函数。考虑硒的样品使用: // 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) .withTim

我第一次遇到这种方法:使用返回自引用的方法,而不是重载构造函数。考虑硒的样品使用:

   // 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);
//等待30秒,让元素出现在页面上,检查
//每5秒检查一次。
等待等待=新建FluentWait(驱动程序)
.带超时(30秒)
.每(5秒)轮询一次
.忽略(NoSuchElementException.class);

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

重载构造函数和其他方法是一种很好的方法,您可以更轻松地为自己和其他开发人员使用。想象一下您有一个
add()
方法。如果您想在Java中同时接受
2
“2”
,那么您需要重载构造函数,以便同时接受
字符串和
int

像这样:

public add(String number) {
    ...
}

public add(int number) {
    ...
}

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

这非常接近,请查看该模式适用与否的概述

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

这似乎是一种绕过必须创建一个异常 重载构造函数的数量

事实上,这里没有,因为每个被调用的方法都返回当前对象。
声明明确指出。
在此处创建对象:
newfluentwait(驱动程序)

这些都是流畅的调用。
它避免了在每次需要在对象中设置某些内容时都为变量添加前缀

而不是写:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver);
wait.setTimeout(30, SECONDS)
wait.pollingEvery(5, SECONDS)
wait.ignoring(NoSuchElementException.class);
Wait Wait=new FluentWait(驱动程序);
等待。设置超时(30秒)
等等,每隔(5秒)轮询一次
忽略(NoSuchElementException.class);
你可以写:

Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                      .withTimeout(30, SECONDS)
                      .pollingEvery(5, SECONDS)
                      .ignoring(NoSuchElementException.class);
Wait Wait=new FluentWait(驱动程序)
.带超时(30秒)
.每(5秒)轮询一次
.忽略(NoSuchElementException.class);

还有fluent builder,它是一种以流畅且线程安全的方式实例化对象的方法,但这是另一回事

“项目1 -考虑静态工厂方法,而不考虑构造函数”。在线免费提供。有多种模式和可能性来创建对象并用数据填充它们。有时一个比另一个更合适。但通常这只是个人喜好,这取决于班级。请注意,您的示例也使用带参数的构造函数。构造函数接受必填项。这些方法采用可选的方法。否则,用户可能会创建一个无效对象,因为他不知道必须设置
setDriver(driver)
。OP询问使用命名的
static
factory方法是否比ctor重载有任何优点/缺点。这也解释了为什么重载通常是有用的。但它并没有解决OP的具体场景。他想创建对象,并询问要使用什么模式。@Boris the Spider我没有看到任何静态工厂方法。这些是在构造对象后调用的方法。@Boris不,他没有。他问哪种方法设置类变量更好。@Zabuza我同意,我本可以把它说得更清楚,但似乎其他人现在已经澄清了这一点:)你也可以在流畅的接口中创建不可变的对象。您只需要在每次调用
with something
时创建一个新实例。但你们是对的,使用生成器和构造函数更自然。而且,若可变对象用作HashMap@ArtemPetrov没错。还有很多其他的原因,所以我就用“易变性很糟糕”来结束它。