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

その後にゲッターとセッターが続きます。

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

3 に答える 3

2

上記のどの方法でも機能しますが、これが最適です。クラスを初期化する全体のポイントは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);
}
于 2016-02-17T19:27:31.170 に答える
1

Struts で問題が発生する可能性があるため、フィールド宣言でフィールドを初期化してはならないことをどこかで読みました (ただし、現在はステートメントが見つかりません)。

いいえ、私が知っているわけではありません

そのため、コンストラクターでフィールドを初期化しています。

できますが、強制されません。アクションでコンストラクターを使用することはありません (Java EE 6+ と CDI を使用しており、コンストラクターでは@Injected オブジェクトがまだ注入されていないため、コンストラクターはほとんど使用しません。必要に応じて代わりにメソッドを使用します@PostConstruct)。それはあなた次第です、それは規則ではありません。

私の質問は、あなたがそれを行う方法は重要ですか?

いいえ

それとも、クラスをインスタンス化した後にのみ、新しいオブジェクトを配置する必要がありますか?

Struts2 は、JSP で null を処理します。処理する必要があるのは Java 側だけNullPointerExceptionなので、null をチェックするか、宣言でオブジェクトをインスタンス化するだけで、もう心配する必要はありません。

Struts2 では、Bean を JSP 値でインスタンス化するために、引数なしのコンストラクターが必要になることに注意してください。

于 2016-02-17T20:57:55.777 に答える
0

Struts2 では問題ではありません。( interfaceModelDrivenを使用している場合) オブジェクトを自分で作成するだけで十分です。ModelDriven

nullフレームワークは、フォームが送信されたときにオブジェクトを作成します。このオプションはデフォルトで有効になっています。魔法はインターセプターによって実行されます。paramsインターセプターは内部でOGNLを使用して、アクションに渡されたパラメーターからモデルを設定します。

このインターセプターが呼び出されている間、ReflectionContextState#CREATE_NULL_OBJECTS可能であれば、null 参照が自動的に作成されるようにフラグ ( ) がオンになります。詳細については、型変換のドキュメントとInstantiatingNullHandler javadocs を参照してください。


多かれ少なかれ、この機能はcom.opensymphony.xwork2.conversion.NullHandlerの下に文書化されています。

Bean はJavaBeans 仕様に準拠する必要があります。であるため、Struts2 フレームワークによってインスタンス化できます (JavaBeans について詳しく知りたい場合は、この投稿What is a JavaBeanまさにを参照してください)。

于 2016-02-17T19:27:43.590 に答える