2

关于项目: 我正在尝试用 Java 编写类似 CMS 的网站。以前我将 PHP 用于此类目的,但现在我需要与现有的用 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();
        ...
    }
}

在这里,例如,此标志用于更改某些全局首选项的情况,这可能会更改文章工作 - 例如,数据库上的某些操作,通过查询浏览器或其他执行 - 类“缓存”文章和组树(它没有保留整篇文章 - 只有标题、ID、ParentGroup 或其他一些......

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

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

而且,我检查了,“Module.setChanged(true)”执行成功......但是当谈到文章类中的“getChanged()”时,我得到了错误......

是否有任何方法可以创建静态变量,在所有类中都是静态的,可以扩展它,或者我根本不明白什么?类文章中的案例“Module.getChanged()”也进行了测试 - 结果是一样的......

4

2 回答 2

1

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

private final static boolean Changed;

通常,您不应修改声明为 final 的成员。所以不应该允许设置器:

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

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

于 2012-05-02T21:01:13.250 回答
1

只需从

private final static boolean Changed;

并且代码应该可以正常工作。

于 2012-05-02T21:06:51.570 回答