关于项目:
我正在尝试在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),以将数据库访问的所有这种“优化”与实际代码脱钩。