2016-02-17 6 views
1

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

Мой вопрос: имеет значение, каким образом вы это делаете? Или вы не должны делать это вообще и только ставить новые объекты после создания экземпляра класса? Другими словами, должен ли я определять свой класс следующим образом:

public class MenuView implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private ProjectInfo projectInfo; 
private PartyInfo partyInfo; 
private RequestTableInfo requestTableInfo; 
private PartyRequestInfo partyRequestInfo; 

public MenuView(){ 
    projectInfo = new ProjectInfo(); 
    partyInfo = new PartyInfo(); 
    requestTableInfo = new RequestTableInfo(); 
    partyRequestInfo = new PartyRequestInfo(); 
} 

, за которым следует геттеры и сеттеры или вот так.

public class MenuView implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private ProjectInfo projectInfo = new ProjectInfo(); 
private PartyInfo partyInfo = new PartyInfo(); 
private RequestTableInfo requestTableInfo = new RequestTableInfo(); 
private PartyRequestInfo partyRequestInfo = new PartyRequestInfo(); 

public MenuView(){ } 

с последующим геттеров и сеттеры или как это:

public class MenuView implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private ProjectInfo projectInfo; 
private PartyInfo partyInfo; 
private RequestTableInfo requestTableInfo; 
private PartyRequestInfo partyRequestInfo; 

public MenuView(){} 

с последующим геттеры и сеттеры, а затем его экземпляр так:

MenuView menu = new MenuView(); 
menu.setProjectInfo(new ProjectInfo); 
+1

Его всегда лучше всего инициализировать в конструкторе, поэтому вызов его экземпляра избегает нулевого указателя –

ответ

1

Я где-то читал, что вы не должны инициализировать поля в объявлении поля, потому что может вызвать проблемы для Struts (но я не могу найти заявление сейчас)

Нет, не то, что я знаю

поэтому я инициализирую поля в конструкторе.

Вы можете, но вы не вынуждены. Я никогда не использую конструкторы для действий (я почти никогда не использую конструкторы вообще, так как я использую Java EE 6+ и CDI, а в конструкторах еще не были введены объекты @Inject) - I use a @PostConstruct method вместо этого, если это необходимо), но это все для вас это не правило.

Вопрос в том, каким образом вы это делаете? не

Нет

Или вы не сделать это на всех, и только положить в новые объекты после создания экземпляра класса?

Struts2 будет обрабатывать нули для вас в JSP. Единственные NullPointerException, которые вы должны обрабатывать, находятся на стороне Java, поэтому просто проверяйте значение null или создавайте объекты в декларации и больше не беспокойтесь об этом.

Просто помните, что Struts2 will need a no-arg constructor to instantiate beans with JSP values.

+1

Спасибо за информацию! – ponder275

2

Любой из указанных выше способов будет работать, но это было бы лучше. Вся цель инициализации класса заключается в том, чтобы избежать нулевых указателей, конечно, и инициализировать его предпочтительными значениями, как показано ниже. Добавление добытчиков и сеттера будут работать нормально с там

public class MenuView implements Serializable { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 

private ProjectInfo projectInfo; 
private PartyInfo partyInfo; 
private RequestTableInfo requestTableInfo; 
private PartyRequestInfo partyRequestInfo; 

public MenuView(int a, int b, int c, int d){ 
    projectInfo = new ProjectInfo(a); 
    partyInfo = new PartyInfo(b); 
    requestTableInfo = new RequestTableInfo(c); 
    partyRequestInfo = new PartyRequestInfo(d); 
} 
+1

Этот метод не будет работать с объектами, идущими из JSP, потому что [Struts2 нуждается в конструкторе no-args, который создает экземпляр объекта перед настройкой параметров к нему] (http://stackoverflow.com/a/19562738/1654265). –

1

Это не имеет значения для Struts2, только достаточно, чтобы модель управляемого объектом, который вы должны создать сам (если вы используете ModelDriven). Структура будет создавать объекты, если они представлены null при отправке формы. Эта опция включена по умолчанию. Магия выполняется перехватчиком params, который использует OGNL под капюшонами, чтобы заполнить модель из параметров, переданных в действие.

Хотя этот перехватчик быть вызван, флаг (ReflectionContextState#CREATE_NULL_OBJECTS) включен, чтобы обеспечить , что любая пустая ссылка автоматически создается - если это возможно. См. документацию type conversion и InstantiatingNullHandler javadocs для получения дополнительной информации.


Более или менее эта функция описана под com.opensymphony.xwork2.conversion.NullHandler.

Бобы должны соответствовать JavaBeans spec., поэтому они могут быть созданы с помощью рамки Struts2 (если вы хотите узнать больше о JavaBeans, см. Это сообщение What is a JavaBean exactly).

+0

Спасибо за информацию! – ponder275

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