Web アプリケーションの Java Bean に PropertyChangeSupport および PropertyChangeListener のサポートを追加する必要がありますか?
-
13-09-2019 - |
質問
きがついた 一部の人々 Property Change オブザーバー パターンをサポートする Bean を書き込みます。
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
public class SampleBean implements Serializable {
public static final String PROP_SAMPLE_PROPERTY = "sampleProperty";
private String sampleProperty;
private PropertyChangeSupport propertySupport;
public ChartBean() {
propertySupport = new PropertyChangeSupport(this);
}
public String getSampleProperty() {
return sampleProperty;
}
public void setSampleProperty(String value) {
String oldValue = sampleProperty;
sampleProperty = value;
propertySupport.firePropertyChange(PROP_SAMPLE_PROPERTY, oldValue, sampleProperty);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
propertySupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
propertySupport.removePropertyChangeListener(listener);
}
}
ただし、Web アプリケーションのステートレスな性質のため、オブザーバー パターンは Web ベースの MVC パターンでは一般的に使用されない、と読んだ記憶があります。
上記のパターンに従うのは良い習慣ですか? ウェブアプリケーション ジャワ豆?
解決
正直に言うと、実際にその機能が必要になる場合にのみ面倒になります。ほとんどの Web アプリケーションでは必要ありません PropertyChangeSupport
. 。実際、これまで見たどの Web アプリでもそれが使用されているのを見た記憶がありません。私はそれが Swing アプリケーションで使用されているのを見たことしかありません。
典型的な bean
Web アプリケーションのオブジェクトは非常に短命であり、単一のリクエストを処理する準備ができた後、ガベージ コレクションのために空に捨てられます。主な問題は、Web アプリケーションは本質的に同時実行およびマルチユーザーであるため、リスナーやイベントなどを含む長期間存続するオブジェクトには向いていないということです。
他のヒント
PropertyChangeListener
とにかく、かなり貧弱な設計です - 魔法の文字列比較すべてです。シンプルなモデルを使用することをお勧めします。 ChangeListener
(または同様のもの) を作成し、複合モデルと結合します。
インタラクティブでCOMETっぽいことをしているのでない限り、Webアプリケーションではあまり意味がありません。通常は、現在のすべての情報が一度にまとめられるプル モデルを使用します。キャッシュがある場所に意味があるかもしれません。
Web アプリと同じ方法でデスクトップ アプリケーションを作成することもできます。変更 (または一連の変更) を行って GUI を同期します。これでかなりコンパクトになることがわかります。また、パフォーマンス コストは、大きな変更 (ウィンドウを開くなど) のクリティカルな時間から移動され、サイクルを書き込む必要がある非クリティカルな時間に分散されます。
1) 必要になることがわかっている場合を除き、プロパティ変更サポートを追加しないでください。
2) Bean が getters/setter/equals/hashcode 以外に何も含まない単なる値オブジェクトである場合は、AOP フレームワーク (私は Spring が好きです) を使用して、プロパティ変更イベント/サポートの実装に使用されるアドバイスでオブジェクトをラップすることを検討してください。こうすることで、特定のコンテキスト (通常は UI) でのみ必要であり、異なるコンテキストでは変更される可能性のあるロジックで Bean が汚染されないようにします。これは、特定のアプリのすべてのドメイン Bean にプロパティ変更サポートを追加したときに学んだ教訓です。UI ではそれが使用されましたが、サーバー チームは混乱し (そこでは使用されませんでした)、使用されなかった場合は単なるノイズでした。
また、場合によっては個々のプロパティに耳を傾ける必要はなく、 何でも オブジェクト内が変更されました。