【问题标题】:Why we initiate object inside constructor为什么我们在构造函数中启动对象
【发布时间】:2013-09-10 07:48:15
【问题描述】:

为什么我们在构造函数内部实例化一些对象而在外部实例化一些对象。这样做有什么优点/缺点。

public class HomePage_Util {
private Common_Functions cfObj = new Common_Functions();
HomePage_OR home_ORobj;
Logging logObj = new Logger();
public static String scptName;
public ArrayList<String> homeScriptMsgList = new ArrayList<String>();

public HomePage_Util(WebDriver driver) {
    home_ORobj = new HomePage_OR();
    PageFactory.initElements(driver, home_ORobj);
}

【问题讨论】:

    标签: java class constructor


    【解决方案1】:

    对象仅在需要初始化序列中的其他对象时才在构造函数中初始化。就像在您的示例中一样,首先将创建对象,即 home_ORobj = new HomePage_OR();,因为在下一步初始化 PageFactory 元素时需要该对象。

    因此,如果 home_ORobj = new HomePage_OR(); 不需要初始化 PageFactory 元素,那么您可以将其写出构造函数,即全局。

    【讨论】:

      【解决方案2】:

      代码重用是在构造函数中初始化元素的主要优点。此外,只有在创建对象或调用构造函数时,初始化一些东西才有意义。

      【讨论】:

        【解决方案3】:

        构造函数基本上是用于创建new object of a class。创建对象时,会创建该对象的所有变量的副本并分配default value

        在构造函数中初始化一些变量的目的是在创建对象的时候赋值。这样您就不必隐式赋值。

        【讨论】:

          【解决方案4】:

          我的猜测是,此类代码的编写者不确定 home_ORobj 是否会在调用 initElements() 之前被初始化,但外部的会先初始化,所以没关系。

          尽管如果它们相互依赖(即在构造函数的参数中使用另一个),最好将它们放在构造函数中,因为代码格式化程序可能会重新排序破坏代码的元素列表。

          【讨论】:

            【解决方案5】:
            1. 某些对象需要初始化几个字段,以便在使用之前正确构造该对象。构造函数在对象被创建时被调用,因此它在构造函数中被初始化。
            2. 您可以为不同的场景使用不同初始化的重载构造函数。
            3. 您始终可以拥有一个名为 initializeValues 的方法,并在创建对象后调用它,而不是将其放入构造函数中。
            4. 将它放在构造函数中将确保在您创建对象时始终调用它。
            5. 超类构造函数总是在派生类构造函数之前调用,所以有意义。

            【讨论】:

              【解决方案6】:

              一个优点是避免使用静态块来初始化静态成员。 AFAIK 在对象的生命周期中并不完全相同:构造函数在第一次初始化之后执行。

              【讨论】:

                【解决方案7】:

                在构造函数之外启动的实例字段在创建新对象时始终是初始状态 - 对于每个实例。在构造函数中启动的那些可能对新实例具有某些特殊含义,例如您示例中的 WebDriver 似乎具有,因此它不能在其他地方启动。需要将某种类型的实例作为参数传递的构造函数确实会强制设计,因为它不能传递任何其他内容,并且没有它就无法构造。

                一个类可能包含多个构造函数,这些构造函数的行为可能不同并实例化不同的字段,而其他字段则保持不变(例如,当一个类有多个用途时,这实际上可能表明设计不佳)。

                此外,如果一个类没有默认构造函数 => 在反序列化时不会调用构造函数。

                【讨论】:

                  猜你喜欢
                  • 2011-05-18
                  • 2011-02-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-06
                  • 2011-02-11
                  • 1970-01-01
                  • 2018-01-29
                  • 2015-01-27
                  相关资源
                  最近更新 更多