代码之家  ›  专栏  ›  技术社区  ›  Srinivas Reddy Thatiparthy

关于构造函数

  •  5
  • Srinivas Reddy Thatiparthy  · 技术社区  · 16 年前

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

    是否有任何条件可以将这些数量众多的参数传递给构造函数? 请详细说明这些要点以及关于施工人员的任何要点。

    编辑 :对于我提出的问题,很抱歉。是的,我们使用构造函数创建一个对象,并使用setter指定值,但我的问题是比较默认的构造函数和setter,以及使用显式参数的构造函数。

    7 回复  |  直到 16 年前
        1
  •  11
  •   Jon Skeet    16 年前

    不,这不仅仅是一种方便,而不是设置器。尤其是,只能调用构造函数 一旦 .使用构造函数参数,您可以创建不可变的类型,这些类型在构造时给定了它们的值——这在setter中是不可能的。

    这通常不是一个好主意 巨大的 参数的数目,无论是对于构造函数还是普通方法。如果你发现你有很多参数, 可以 希望创建一个表示所有相关类型的类型- 那个 类型可以有一组getter/setter。见 ProcessStartInfo 举个例子。

        2
  •  10
  •   Frederik Gheysels    16 年前

    我是这样看的:

    在构造函数中传递参数是创建处于“有效”状态的对象所必需的。

    例如:我不会将“webform中的必需字段”传递给由这些值填充的类的实例。

        3
  •  4
  •   Brian Agnew    16 年前

    你得叫二传手 对象和构造函数 创造 那个物体。如果没有构造函数调用,就没有可调用的对象。

    重新。参数的数目。如果您有大量的参数,这意味着:

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

    退房 Factory 模式和 Builder 一些备选方案的模式。创建对象。

    另请注意。构造函数参数和setter。在爪哇和C.*中,传递给构造函数的参数只能用于一次初始化字段,并且从该点开始,字段是不可变的(不像通过设置程序设置这些字段)。这对代码可靠性有很大的好处(以对象不可变性为代价)。

        4
  •  3
  •   Craig Schwarze    16 年前

    构造函数用于初始化类。您应该传递尽可能多的参数,以便将类定义为所需的初始状态。

    注意,也可以重载构造函数。

        5
  •  2
  •   helpermethod    16 年前

    如果您有一些非可选参数和许多可选参数,并且希望避免在构造函数中使用looong参数列表(这可能非常容易出错,尤其是当参数属于同一类型时),那么您应该倾向于使用

    Builder pattern

    相反。

        6
  •  0
  •   Waverick    16 年前

    你也可以考虑使用 Factory pattern 用于对象创建。

        7
  •  0
  •   Amir Moghimi    16 年前

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

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

    • 注射: 当我们使用依赖注入框架时,例如 Spring Guice 框架使一种方法比另一种方法更可取。例如,Spring鼓励setter注入,而不是构造函数注入。Spring主要使用默认构造函数构造对象(bean),然后使用setter方法注入依赖项。然后Spring为您调用init(postconstruct)方法。所以,您可以在这个方法中进行任何您想要的初始化,并在适当的地方设置依赖项。相反,Guice鼓励将构造函数注入作为其最佳实践。

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

    • 新的 或委托: 无论你什么时候去 新的 一个对象,不管是使用构造函数还是setter方法来填充字段,如果有一天可能需要某个人在这里传递(注入、创建)它,这是一个很好的实践。这导致了 Factory 设计模式,这在开发工具和库时尤其有用。