关于项目: 我正在尝试在Java上编写类似CMS的网站。以前我使用PHP来实现这个目的,但是现在我需要与现有的服务器端解决方案紧密集成,用java编写,因此决定将Java用于网站。目前,为了更容易开发,我对我的项目进行了一些“层次结构”:顶级“服务器”类(在最近的将来它将填充内容和功能,但现在它是空的),下一个子系统,扩展,以及任何一个的一部分 - 模块和块。他们每个人都有一些限制和可能性,彼此不可用......也许有其他方式,但目前我不知道。
我正在进行某种缓存,这取决于事实,我的Dynamic Web Project的变量可以一直保存在内存中。例如,表示所有这些元素的“Tree”,从数据库加载并保存在内存中,以及所有下一个请求(例如,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或其他一些......
问题本身:在servlet中主要在doGet(...)我有下一个代码执行:
if(request.getParameter("SetModify") && UsersManager.inGroup(currentUser,"Administrator")
Module.setChanged(true);
并且,我检查了“Module.setChanged(true)”已成功执行...但是当在类文章中提到“getChanged()”时,我得到了错误......
是否存在创建静态变量的任何方法,它将在所有类中是静态的,扩展它,或者我只是不理解某些东西?案例中的“Module.getChanged()”案例也经过测试 - 结果相同......
答案 0 :(得分:1)
我很惊讶您的代码编译,因为您在此处使用'final'关键字:
private final static boolean Changed;
通常,您不应该修改声明为final的成员。所以不应该允许设置者:
public static void setChanged(boolean newState){
Changed = newState;}
Protip:您可能希望研究一个更完善的系统,如EhCache with Spring,将所有这些“优化”数据库访问与实际代码分离。
答案 1 :(得分:1)
只需从
中删除“最终”private final static boolean Changed;
并且代码应该可以正常工作。