1

我有一个类,用于存储从数据库中检索到的数据,该数据库具有对象作为字段。

我想在实例化类时初始化对象以避免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();
}

其次是getter和setter或像这样。

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(){  }

其次是getter和setter或像这样:

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(){}

其次是getter和setter,然后像这样实例化它:

MenuView menu = new MenuView();
menu.setProjectInfo(new ProjectInfo);
4

3 回答 3

2

上述任何方法都可以,但这是最好的。初始化类的重点当然是避免null引用,并使用首选值初始化它们,如下所示。

从那里添加 getter 和 setter 就可以了

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);
}
于 2016-02-17T19:27:31.170 回答
1

我在某处读到您不应该初始化字段声明中的字段,因为这可能会导致 Struts 出现问题(但我现在找不到该语句)

不,我不知道

所以我正在初始化构造函数中的字段。

你可以,但你不是被迫的。我从不在操作中使用构造函数(我几乎从不使用构造函数,因为我使用的是 Java EE 6+ 和 CDI,并且在构造函数中@Inject还没有注入 ed 对象——我在必要时使用了一个@PostConstruct方法),但是这取决于你,这不是规则。

我的问题是你用哪种方式做这件事有关系吗?

或者您应该根本不这样做,只在实例化类后放入新对象?

Struts2 将在 JSP 中为您处理空值。您必须处理的唯一NullPointerExceptions 是在 Java 端,所以只需检查 null 或实例化声明中的对象,就不用担心了。

请记住,Struts2 将需要一个无参数构造函数来实例化具有 JSP 值的 bean

于 2016-02-17T20:57:55.777 回答
0

对 Struts2 来说没关系,只要ModelDriven你自己创建一个对象就足够了(如果你正在使用ModelDriveninterface)。

如果null提交表单时,框架将创建对象。默认情况下启用此选项。魔术是由params拦截器执行的,它在引擎盖下使用OGNL从传递给动作的参数中填充模型。

在调用此拦截器时,ReflectionContextState#CREATE_NULL_OBJECTS会打开一个标志 ( ) 以确保自动创建任何空引用 - 如果可能的话。有关更多信息,请参阅类型转换文档和InstantiatingNullHandler javadocs。


或多或少这个特性记录在com.opensymphony.xwork2.conversion.NullHandler下。

bean 应该符合JavaBeans 规范。,因此它们可以由 Struts2 框架实例化(如果您想了解有关 JavaBeans 的更多信息,请参阅这篇文章究竟是什么是 JavaBean)。

于 2016-02-17T19:27:43.590 回答