2013-09-10 6 views
0

Почему мы создаем экземпляр некоторого объекта внутри конструктора и вне его. Каковы преимущества/недостатки этого.Почему мы инициируем объект внутри конструктора

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); 
} 

ответ

0

Объекты инициализируются в конструкторах только тогда, когда они необходимы для инициализации других объектов в последовательности. Как и в вашем примере, прежде всего объект i.e.home_ORobj = new HomePage_OR(); будет создан, так как этот объект необходим для инициализации элементов PageFactory на следующем шаге.

Так что если home_ORobj = new HomePage_OR(); не требуется инициализировать элементы PageFactory, тогда вы можете записать его из конструктора, то есть во всем мире.

0

Повторное использование кода является основным преимуществом инициализации элементов в конструкторе. Также инициализация нескольких вещей имеет смысл только при создании объекта или вызове конструктора.

0

Конструктор в основном предназначен для создания new object of a class. Когда вы создаете объект, создается копия всей переменной для этого объекта и назначается default value.

Целью инициализации некоторых переменных в конструкторе является присвоение значения во время создания объекта. Так что вам не нужно указывать значение неявно.

0

Я предполагаю, что автор такого кода не был уверен, будет ли initial_ORobj инициализирован до вызова initElements(), но сначала будут инициализированы те, что находятся снаружи, поэтому это не имеет значения.

Хотя, если они зависят друг от друга (т. Е. Используют другой в параметрах конструктора), полезно добавить их в конструктор, так как форматирование кода может переупорядочить список элементов, нарушающих код.

0
  1. Некоторые объекты требуют инициализации нескольких полей, чтобы правильно построить этот объект до его использования. Конструктор вызывается, когда объект создается, поэтому он инициализируется в конструкторе.
  2. У вас может быть перегруженный конструктор с различным инициализацией для разных сценариев.
  3. У вас всегда может быть метод initializeValues ​​и вызывать его после создания объекта, а не поместить его в конструктор.
  4. Ввод его в конструкторы гарантирует, что он всегда вызывается при создании объекта.
  5. Конструктор суперкласса всегда вызывается перед конструктором производного класса, поэтому имеет смысл.
0

Преимущество состоит в том, чтобы избежать статического блока для инициализации статических элементов. AFAIK Это не совсем то же самое в жизненном цикле объекта: конструктор выполняется после первых инициализаций.

0

Поле экземпляра, которое инициируется вне конструктора, всегда будет таким образом изначально при создании нового объекта - для каждого экземпляра. Те, которые инициируются в конструкторе, могут иметь какое-то особое значение для нового экземпляра, такого как WebDriver в вашем примере, похоже, что он не может быть инициирован в другом месте. Конструктор, который требует, чтобы экземпляр определенного типа передавался как аргумент, обеспечивает исполнение проекта, поскольку он не может передаваться ничем другим и не может быть построен без него.

Класс может содержать несколько конструкторов, которые могут вести себя по-разному и создавать экземпляры разных полей и оставлять других нетронутыми (например, когда для класса есть несколько целей, что фактически может указывать на плохой дизайн).

Кроме того, если класс не имеет конструктора по умолчанию => при десериализации, вызов конструктора не будет вызван.

Смежные вопросы