2016-04-29 10 views
1

このシナリオでリフレクションを使用する必要があるかどうかわからないので、この問題についてあなたの意見を聞いています。この例ではReflectionを使用することが適切です

シナリオは、私が汚れた状態にあるかどうかを調べる必要があるということです。ユーザーがテーブルに変更を加えた後、変更を保存せずに別のページに移動すると、「未保存の変更が失われる」という警告メッセージが表示されます。

私が使用しているアプローチは、テーブルが汚れている場合はtrueに設定され、それ以外の場合はfalseに設定されます。ユーザーがテーブルを保存せずにリンクをクリックすると(別のサイトに移動するリンク)、警告メッセージがポップアップします。一方、ユーザーがナビゲートする前にテーブルを保存すると、警告メッセージは表示されません。

ダーティーフラグを静的にすると発生する可能性がある問題は、別のユーザーが、そうでないべき状態でフラ​​グを検出できることです。静的変数はクラスにバインドされているので、この変数をチェックするたびに、このフィールドの値はアプリケーションのすべてのユーザーで共有されます。

しかし、静的にしてメンバー変数として使用しないと、オブジェクトをリフレクションでインスタンス化すると、デフォルト値が返されます。 Booleanの場合はFalse、Stringの場合はnull、またはそれまでの値はで初期化されます。

これは、この例でReflectionが最適なオプションではないという結論に至りましたか?

私はあなたからのご意見をお待ちしております、あなたの意見/意見は非常に高く評価されています。

ありがとうございました。

答えて

1

テーブルはTableModelによってバックアップされます。ユーザーのデータページを表示し、ユーザーがそのモデル内のデータを編集できるようにするTableModelのインスタンス。保存された状態にあるかどうかを「認識」する必要があります。単にカスタム・テーブル・モデルを作成し、ダーティフラグを追加することによって行うことができます

- それは毎回setValueAtを引き起こしていますが呼び出されていない:あらゆる種類の反射の

public class DirtyTableModel extends DefaultTableModel { 

    protected boolean dirty; 

    public boolean isDirty() { 
    return dirty; 
    } 
    /** 
    * Called with setDirty(false) after save 
    */ 
    public void setDirty(boolean on) { 
    dirty = on; 
    } 
    @Override 
    public void setValueAt(Object aValue, int row, int column) { 
    setDirty(true); 
    super.setValueAt(aValue, row, column); 
    } 

} 

必要はありません。

0

このフラグがstaticである理由はありません。それをstaticにすることは、それがクラスのプロパティであり、具体的なインスタンスではないことを意味します。言い換えれば、すべてMyTableのインスタンスが汚れているかどうかはわかりません。インスタンス変数としてこのフラグを持って、コンストラクターで初期化してください(またはインラインで、初期化をコンストラクターに置くだけで構文上の違いがあります)。リフレクションを使用してテーブルインスタンスを初期化するかどうかは、この質問にとって重要ではないようです。

関連する問題