关于项目: 我正在尝试用 Java 编写类似 CMS 的网站。以前我使用 PHP 来实现此类目的,但现在我需要与现有的用 java 编写的服务器端解决方案紧密集成,因此决定也将 Java 用于网站。目前,为了更容易开发,我对我的项目做了一些“层次结构”:顶级“服务器”类(在最近的将来它将填充内容和功能,但现在它是空的),下一个子系统,扩展,以及任何其中的一部分 - 模块和 block 。它们每个都有一些限制和可能性,彼此不可用...也许还有其他方法,但目前我不知道。
我正在进行某种缓存,具体取决于我的动态 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)”执行成功...但是当涉及类 Article 中的“getChanged()”时,我得到了 false...
是否有任何方法可以创建静态变量,该变量在所有类中都是静态的,可以扩展它,或者我只是不明白某些东西?类文章中的案例“Module.getChanged()”也经过测试 - 结果是相同的...
最佳答案
我很惊讶你的代码能够编译,因为你在这里使用了“final”关键字:
private final static boolean Changed;
通常您不应该能够修改声明为最终的成员。所以不应允许 setter :
public static void setChanged(boolean newState){
Changed = newState;}
专业提示:您可能希望研究一个更成熟的系统,例如带有 Spring 的 EhCache,以将数据库访问的所有“优化”与实际代码分离。
关于java - 将静态成员委托(delegate)给扩展类 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10421490/