我有一个类用于存储从数据库中检索的数据,该数据库将对象作为字段。我想在实例化类时初始化对象以避免空指针问题。我以为我在某处读到它不应该初始化字段声明中的字段,因为它可能会导致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);
答案 0 :(得分:2)
上述任何一种方法都可以,但这是最好的。初始化类的重点是避免使用空指针,并使用首选值初始化它,如下所示。 添加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);
}
答案 1 :(得分:1)
对于Struts2来说并不重要,只有你自己应该创建的模型驱动对象(如果你使用的是ModelDriven
)。如果提交表单时框架为null
,则框架将创建对象。默认情况下启用此选项。魔术是由params
拦截器执行的,它在引擎盖下使用OGNL来从传递给动作的参数填充模型。
在调用此拦截器时,会出现一个标志 (
ReflectionContextState#CREATE_NULL_OBJECTS
)已启用以确保 任何空引用都会自动创建 - 如果可能的话。看到 type conversion文档和InstantiatingNullHandler
javadocs了解更多信息。
com.opensymphony.xwork2.conversion.NullHandler下记录了此功能。
bean应符合JavaBeans spec.,因此可以通过Struts2框架进行实例化(如果您想了解有关JavaBeans的更多信息,请参阅此帖What is a JavaBean exactly)。
答案 2 :(得分:1)
我在某处读到你不应该初始化字段声明中的字段,因为这可能会导致Struts出现问题(但我现在找不到语句)
不,不是我知道
所以我正在初始化构造函数中的字段。
你可以,但你没有被迫。我从不在操作上使用构造函数(我几乎从不使用构造函数,因为我使用的是Java EE 6+和CDI,而在构造函数中,@Inject
ed对象尚未注入 - I use a @PostConstruct
method而是,必要时),但这取决于你,这不是一个规则。
我的问题是你做哪种方式有关系吗?
没有
或者根本不应该这样做,只在实例化类之后才放入新对象?
Struts2将在JSP中为您处理空值。您必须处理的唯一NullPointerException
是Java端,因此只需检查null,或者在声明中实例化对象,不再担心它。
请记住Struts2 will need a no-arg constructor to instantiate beans with JSP values。