1

假设一个 Car Validator 和许多读取其属性以验证它们的方法。因此,构造它的最佳方式是使 Car 成为实例字段。

两种制作方法:

1)创建一个以 Car 作为参数的构造函数,然后调用 validate()。

2)删除所有构造函数,而是将 Car 作为参数传递给 validate 方法:validate(Car car)。

如果我们想象这个验证器必须不断地验证,比如说 500 辆汽车。

使用1)方法,必须实例化 500 个验证器对象……即使垃圾收集器的工作做得非常好,它似乎也不是最佳实践。好处是 Car 字段的初始化是由构造函数 => 进行的,所以更自然。

使用2)方法,我们避免了1)的缺点,但是我们必须在方法 validate 中初始化 Car 字段,这意味着在对象构造之后。这被认为是一种好习惯吗?实际上,只有 validate 方法使用 Car 字段,此外,只有 validate 方法不是私有的。

当然,还有第三种方法可以避免所有疑虑=>将 Car 从 validate 方法传递给每个私有方法……但我觉得这很丑陋……

我应该选择三种方法中的哪一种?

4

3 回答 3

1

我认为第二种方法是一种反模式,应该避免,它类似于臭名昭著的SimpleDateFormat类(它看起来像无状态和线程安全的,但事实并非如此)。

关于其他方法,如果你真的有很多私有方法,最好使用第一种方法,否则你可以使用第三种方法,它对我来说看起来并不太难看。

另请注意,“按原样”使用第一种方法比第三种方法涉及更多的耦合。在第三种情况下,您可以通过注入预先配置的验证器实例将验证器的客户端与其实现分离,而在第一种情况下,您需要引入工厂来实现相同的效果。

于 2012-04-10T11:10:01.383 回答
1

好的做法通常是避免缺点的做法。

使用第二种方法。如果您要创建一个CarValidator类并调用validate(car)它来检查对象的有效性,这似乎是一种非常有效的方法。我不明白为什么你会认为这不是最佳实践?

您是否担心设置一个私有Car变量并在整个验证过程中引用它,而不是通过所有私有方法传递一个实例?只要validate方法是同步的,这种方法就不会有问题。

于 2012-04-10T11:11:29.697 回答
1

我将使用第四种方法,并通过将 Validator 对象注入 Car 构造函数来尽早检查汽车的有效性。我发现,与让无效汽车实例闲置并且必须稍后在多个地方检查有效性(通过有效性()或通过 Validator 对象中的属性)(即不会快速失败)相比,它的缺点要小得多。


更新:如果您在构建期间无法验证 Car 实例,例如因为您在客户端,我会将 Car 实例视为服务器端的受污染值,并使用污染检查器和您的方法 2 来清除它们。

于 2012-04-10T11:41:50.857 回答