java - 将静态成员委托(delegate)给扩展类 - Java

标签 java static-members extends

关于项目: 我正在尝试用 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/

相关文章:

Java 内存错误 : unable to create new native thread

c++ - 在静态成员方法中显式访问静态成员变量 - 在 C++ 中

java - 从类型参数扩展

java - 如何在运行时使用反射扩展类

java - 无法在 Java 中扩展类

Java Files.getFileAttributeView 创建时间戳精度不是 ext4 上的毫秒

java - 如何通过 apache CSV API 跳过 CSV 文件中的空行?

java - 在 IPV4 网络中使用 maven3 但抛出 IPV6 抛出 IPV6 异常

c++ - 线程间共享类的静态数据

c++ - 在不使用静态的情况下在实例之间共享类变量