关于建设者

我有一个关于Constructors的问题。我认为构造函数只是我们的方便而不是setter方法,对吧? 因此,对于一个对象,您认为重要的属性(例如webform中的必需字段)将作为参数传递给构造函数。

是否有任何标准要将这么多参数传递给构造函数? 请详细说明这些要点以及有关构造函数的任何要点。

编辑 :抱歉我问问题的方式。是的,我们用构造函数创建一个对象,我们用setter赋值,但我的问题是默认构造函数与setter和构造函数与显式参数之间的比较。

不,这不仅仅是方便而不是制定者。 特别是,构造函数只会被调用一次 。 使用构造函数参数,您可以创建在构造时赋予其值的不可变类型 – 这对于setter是不可能的。

拥有大量参数通常不是一个好主意,无论是构造函数还是普通方法。 如果您发现有很多参数,则可能需要创建一个表示所有相关参数的类型 – 类型可能包含一堆getter / setter。 有关此示例,请参阅ProcessStartInfo

我这样看:

您可以在构造函数中传递参数,以便创建处于“有效”状态的对象。

对于您的示例:我不会将“webform中的必填字段”传递给填充了这些值的类的实例。

您必须对象调用setter,构造函数才会创建该对象。 如果没有构造函数调用,您将无法调用对象。

回覆。 参数的数量。 如果您有相当数量的参数,则表明:

  1. 相关参数可以组合成对象本身。 例如,TimePeriod对象的开始日期和结束日期
  2. 该对象有太多责任,应该进一步分解

查看工厂模式和构建器模式以获取一些替代方案。 创建对象。

再说一遍。 构造函数参数和setter。 在Java和C#中,传递给constructior的参数只能用于初始化字段一次,并且字段从该点开始是不可变的(与通过setter设置这些字段时不同)。 这对代码可靠性有很大好处(以对象不变性为代价)。

构造函数用于初始化类。 您应该将所需的参数传递给所需的初始状态。

请注意,您还可以重载构造函数。

如果您有一些非可选参数和许多可选参数,并且您希望避免构造函数中的looong参数列表(这可能非常容易出错,特别是如果参数类型相同),您应该支持使用

生成器模式

代替。

您还可以考虑使用Factory模式进行对象创建。

我认为在决定如何创建对象时,应该更加注意对象的部署位置。 我尝试总结一些有助于选择用于填充对象字段的方法的点,即构造函数或setter方法:

  • 状态:按状态,我指的是运行时快照中对象的所有字段的值。 在开发应用程序时,跟踪对象状态非常重要,尤其是在要在多个线程中访问对象时。 即使在单线程编程中,也可以在不同的方法和类中修改对象,尤其是在通过引用传递所有对象的Java等语言中。 将状态设置为对象(在构造函数中)的所有生命周期并避免设置器(称为不可变模式)使编程(尤其是并发编程)变得非常容易。 但请注意,这种方法会增加对象修改成本,因为所有字段都应该在每次修改时复制到新实例中; 例如,在Java中,将String(不可变)与StringBuilder和StringBuffer(有状态)进行比较。 String是线程安全且易于使用的,但是对于长字符串创建而言代价很高,而StringBuilder不是线程安全的,但是连接小字符串的速度很快。 同时,StringBuffer既是有状态又是线程安全的,但在每个方法调用中都是昂贵的,因为它的方法是同步的 (这意味着:在大多数用例中不需要时,不要使有状态对象成为线程安全的)。 因此,作为一般提示:对于在多个线程中访问的对象使用构造函数(和不可变模式),并使用setter来处理受更多控制的本地对象和字段。

  • 注入:当我们使用dependency injection框架(如Spring或Guice)时 ,框架使一个方法比另一个更优选。 例如,spring比构造函数注入更能鼓励setter注入。 Spring主要使用默认构造函数构造对象(bean),然后使用setter方法注入依赖项。 然后Spring为您调用init(PostConstruct)方法。 因此,您可以使用就地依赖项在此方法中执行所需的任何初始化。 相比之下,Guice鼓励构造函数注入作为其最佳实践。

  • 代码之美:不仅在构造函数中有很长的参数列表并不美观,而且如果应该重载许多其他构造函数以支持多个可选参数,这些构造函数可能因为具有相同的参数类型而发生冲突。 因此,如果许多字段是可选的,则使用setter会更有效。 但我认为即使在这种情况下,对象使用场景也更为重要。 如其他开发人员在此处所建议的那样,可以通过将参数分组在其他类中来解析长参数列表。

  • to new或To Delegate:无论何时使用构造函数或setter方法来填充字段,无论何时使用对象,都应该考虑某天是否需要其他人在此处传递(注入,创建)它。 这导致了Factory设计模式,这在开发工具和库时尤其有用。