2

プロジェクトについて: Java で CMS のような Web サイトを作成しようとしています。以前はそのような目的で PHP を使用していましたが、Java で記述された既存のサーバー側ソリューションと緊密に統合する必要があるため、Web サイトにも Java を使用することにしました。現在、開発を容易にするために、プロジェクトのいくつかの「階層」を作成しました。トップレベルの「サーバー」クラス(近い将来、コンテンツと機能で満たされる予定ですが、現在は空です)、次のサブシステム、拡張機能、およびこのいずれかの一部 - モジュールとブロック。それぞれにいくつかの制限と可能性があり、互いに利用できません...おそらく他の方法があるかもしれませんが、現在私はそれを知りません.

私の動的Webプロジェクトのvarsを常にメモリに保持できるという事実に応じて、ある種のキャッシュを作成しています。たとえば、このすべての要素を表す「ツリー」は、データベースからロードされてメモリに保持され、次のすべての要求 (たとえば、どの拡張機能がこのモジュールを子として持っているか - 権限を管理するため) はデータベースに問い合わせることなく行われます。

もちろん、この目的のために、データが変更され、データベースから更新する必要があることを要素に伝えるフラグが必要です。単一のグローバル フラグ (コンテキストなど) は良くありませんが、ほぼすべての状況で、単一の要素またはグループを更新する必要があります。単一要素のフラグは完了していますが...

実現について: 問題そのもの。クラスモジュールがあるとしましょう:

public abstract class Module{
    private final static boolean Changed;
    public static boolean getChanged(){
        return Changed;}
    public static void setChanged(boolean newState){
        Changed = newState;}
    public abstract String getName();
    public abstract String getTitle(HttpServletRequest request,
        HttpServletResponse response, ServletContext context);}

そして、私はいくつかのモジュールを持っています:

public final class Articles extends Module{
    public class Article{...}
    private Tree<Article> ArticleList;
    public final ArrayList<Article> getArticlesInGroup(int groupID){
        if(getChanged())
            refreshFromDatabase();
        ...
    }
}

ここで、たとえば、このフラグは、一部のグローバル設定を変更する場合に使用されます。これにより、記事の作業が変更される可能性があります。たとえば、クエリ ブラウザまたはその他の方法で実行されるデータベースの操作などです。記事とグループのツリーをクラス「キャッシュ」します。 (記事全体を保持するのではなく、タイトル、ID、ParentGroup、またはその他のもののみを保持します...

問題自体: doGet(...) のサーブレット Main で、次のコードを実行しました:

if(request.getParameter("SetModify") && UsersManager.inGroup(currentUser,"Administrator")
    Module.setChanged(true);

そして、「Module.setChanged(true)」が正常に実行されたことを確認しました...しかし、Articleクラスの「getChanged()」に関しては、falseになりました...

すべてのクラス間で静的になり、それを拡張する静的変数を作成する方法はありますか、それとも単に何かを理解していませんか? Case "Module.getChanged()" in class Articles もテスト済み - 結果は同じです...

4

2 に答える 2

1

から「最終」を削除するだけです

private final static boolean Changed;

コードは正常に機能するはずです。

于 2012-05-02T21:06:51.570 に答える
1

ここで「final」キーワードを使用しているため、コードがコンパイルされることに驚いています。

private final static boolean Changed;

通常、final として宣言されたメンバーを変更することはできません。したがって、セッターは許可されるべきではありません:

public static void setChanged(boolean newState){
     Changed = newState;}

プロのヒント: Spring を使用した EhCache のようなより本格的なシステムを調べて、データベース アクセスのこの「最適化」を実際のコードから切り離すことをお勧めします。

于 2012-05-02T21:01:13.250 に答える