2012-05-02 75 views
2

關於項目: 我想在Java上編寫類似CMS的網站。以前我使用PHP來達到這個目的,但現在我需要與現有的服務器端解決方案(用Java編寫)緊密集成,因此也決定將Java用於網站。目前,爲了更容易開發,我做了一些我的項目的「層次結構」:頂層「服務器」類(在最近的將來它將充滿內容和功能,但現在它是空的),下一個子系統,擴展和任何這一部分 - 模塊和塊。他們每個人都有一些限制和可能性,彼此不可用...也許有其他方式,但目前我不知道它。委託靜態成員擴展類 - Java

我正在做一些類型的緩存,依賴於這樣的事實,即礦山動態Web項目的增值經銷商可以在內存中保存的所有的時間。例如,表示所有這些元素的「樹」,從數據庫加載並保存在內存中,以及所有下一個請求(例如,哪些擴展將此模塊作爲子級 - 用於管理權限),而不詢問數據庫。

當然,對於這個目的,我需要有一些標誌,這將告訴元素,其數據被改變,他們需要從數據庫刷新。單個全局標誌(例如在上下文中)是不好的,而在幾乎所有情況下,我都需要刷新單個元素或組。單個元素的標誌已完成,但...

關於實現: 問題本身。可以說我有類模塊:

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

這裏,例如,使用此標誌爲改變一些全局偏好的情況下,這可能會改變文章的工作 - 例如,對數據庫的一些操作,通過查詢瀏覽器或其他一些操作執行 - 類「緩存」文章和組的樹(它不保存整篇文章 - 只有Title,ID,ParentGroup或其他一些內容...

本身的問題:在servlet的主要在的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;} 

普羅蒂普:你可能想看看喜歡的Ehcache和春天有個更加羽翼豐滿系統解耦從實際代碼數據庫訪問的所有這種「優化」。

+0

對不起,這個「最終」 - 我的SVN目前不可用,所以從本地,非同步副本粘貼代碼。修正了這個問題,但是......當然,問題依然存在。 –

+0

該死的......你說得對。現在重新測試它,並且所有工作都正常......必須在工作中測試時捕獲其他一些錯誤。現在來看看建議的系統。 –

1

剛剛從

private final static boolean Changed; 

刪除 「最終」,代碼應該正常工作。