Как правильно инициализировать поля классов действий в Struts 2?

У меня есть класс, который я использую для хранения данных, которые я извлекаю из базы данных, которая имеет объекты в качестве полей.

Я хочу инициализировать объекты при создании экземпляра класса, чтобы избежать проблем с указателем null.

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

Мой вопрос:

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

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

person ponder275    schedule 17.02.2016    source источник
comment
Всегда лучше, чтобы инициализация выполнялась в конструкторе, поэтому вызов его экземпляра позволяет избежать нулевого указателя.   -  person philip oghenerobo balogun    schedule 17.02.2016


Ответы (3)


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

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

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

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

Мой вопрос: имеет ли значение, как вы это делаете?

No

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

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

Просто помните, что Struts2 потребуется конструктор без аргументов для создания экземпляров bean-компонентов со значениями JSP.

person Andrea Ligios    schedule 17.02.2016
comment
Спасибо за информацию! - person ponder275; 18.02.2016

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

Добавление геттеров и сеттеров будет отлично работать оттуда

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);
}
person philip oghenerobo balogun    schedule 17.02.2016

Это не имеет значения для Struts2, достаточно только того, что объект ModelDriven вы должны создать самостоятельно (если вы используете ModelDriven интерфейс).

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

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


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

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

person Roman C    schedule 17.02.2016
comment
Спасибо за информацию! - person ponder275; 18.02.2016