关于项目:
我正在尝试在Java上编写类似CMS的网站。以前,我将PHP用于此类目的,但现在,我需要与现有的用Java编写的服务器端解决方案紧密集成,因此决定也将Java用于网站。目前,为了便于开发,我对项目进行了一些“层次结构”设置:顶级“ Server”类(在不久的将来将填充内容和功能,但现在为空),下一个Subsystems,Extensions和as这其中的一部分-模块和块。他们每个人都有一些限制和可能性,彼此之间是不存在的……也许还有其他方法,但是目前我还不知道。

我正在进行某种类型的缓存,这取决于事实,即我的Dynamic Web Project的var可以一直保存在内存中。例如,“ Tree”表示代表所有这些元素,这些元素从数据库加载并保存在内存中,并且在不询问数据库的情况下发出了所有下一个请求(例如,什么Extension将此Module作为子模块来管理特权)。

当然,出于这个目的,我需要有一些标志来告诉元素它们的数据已更改,并且需要从数据库中刷新它。单个全局标志(例如,在上下文中)是不好的,而在几乎所有情况下,我都需要刷新单个元素或组。单个元素的标志已完成,但是...

关于实现:
问题本身。可以说我有模块类:

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或其他一些内容...

问题本身:在Servlet Main中的doGet(...)中,我执行了下一个代码:

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


并且,我检查了“ Module.setChanged(true)”是否已成功执行...但是当涉及到Article类中的“ getChanged()”时,我得到了错误...

是否存在创建静态变量的方法,该方法在所有类中都是静态的,可以扩展它,还是我根本不了解?类文章中的案例“ Module.getChanged()”也经过测试-结果相同...

最佳答案

我很惊讶您的代码被编译,因为您在这里使用了'final'关键字:

private final static boolean Changed;


通常,您不应修改声明为final的成员。因此,不应允许设置者:

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


Protip:您可能希望研究一个更成熟的系统(例如带有Spring的EhCache),以将数据库访问的所有这种“优化”与实际代码脱钩。

09-10 09:15
查看更多