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没错。还有很多其他的原因,所以我就用“易变性很糟糕”来结束它。