2012-05-02 11 views
2

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

私は、ダイナミックWebプロジェクトのバールを常にメモリに保持できるという事実に応じて、何らかのキャッシングを行っています。たとえば、データベースからロードされてメモリに保持されているすべての要素を表す「ツリー」、およびデータベースを要求せずに行われたすべての次の要求(たとえば、Extensionがこのモジュールを子として持つ - 権限の管理)。

もちろん、この目的のために、私は要素を伝えるいくつかのフラグを持つ必要があります。そのフラグのデータは変更され、データベースから更新する必要があります。単一のグローバルフラグ(たとえばコンテキスト)は悪いですが、ほぼすべての状況で、単一の要素またはグループをリフレッシュする必要があります。単一要素のフラグは実行されますが、...

実現について: 問題自体です。

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メソッド内のサーブレットメインで(...)私は、次のコードが実行されています

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

をそして、私は、 "(真)Module.setChangedは" 正常に実行がチェック...しかし、それはgetChanged」になると() "のクラス記事では、私は間違いました...

静的変数を作成する方法はありますか?それはすべてのクラス間で静的であるか、それを拡張していますか、ケース「Module.getChanged()」として十分にテストクラスの記事に - 結果は同じです...

答えて

1

私はあなたがここで「最後の」キーワードを使用するので、あなたのコードがコンパイルされることを驚いている:

private final static boolean Changed; 

通常、finalと宣言されたメンバーは変更できません。そうセッターは許されるべきではない。

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

Protip:あなたは、実際のコードからのデータベースアクセスのすべてこの「最適化」を分離するために春とEhcacheのような、より本格的なシステムに見たいと思うかもしれません。

+0

この「最終的な」私のSVNは現在利用できないため、ローカルの非同期コピーの貼り付けられたコードです。仕事でこれを修正しましたが、問題はまだ残っています。 –

+0

ねえ...あなたが正しいです。今すぐ再テストして、すべて正常に動作します...仕事中にテスト中に他のバグが見つかったに違いありません。今推奨システムを調べるようになります。 –

1

だけ

private final static boolean Changed; 

から "最後の" を削除し、コードが正常に動作する必要があります。

関連する問題