Java类的范围静态成员

问题描述:

我正在开发一个使用Java/JSP的Web应用程序。 一个班,说学生,有一个静态成员 static private int _nextID;Java类的范围静态成员

我想知道,如果这_nextID在所有用户会话中是相同的?或者每个会话都有自己的_nextID?

在简单情况下,你可以假设的Student多个实例将共享相同的静态nextID场。但是,除了简单的情况之外(或者你没有的文件),你应该思考。在这种情况下,除非来自nextID计数器的实例id字段传播到更大的应用程序,其中的ID应该是唯一的,否则没问题。在这种情况下,你需要一个更强大的ID生成器(也许你想要一个UUID;也许你想要一个数据库中的主键;也许别的东西)。

请仔细询问自己所需的唯一ID的范围。然后寻求解决方案,解决这个问题并在课堂上记录下来。

一般而言,相同命名的类内的静态字段,但加载由不同类加载器(在相同或在不同的JVM)可以是different instances, something people most often notice when trying to implement the Singleton pattern。所以你的静态变量的范围取决于(在复杂的情况下)相关的类加载器。关于Java namespaces defined by classloader is herehere的更多(最近)详细信息。

SO相关:Difference between Thread.getContextClassLoader()...

+0

说明:*由不同的类加载器加载* - 如果会话分布在不同的JVM中,几乎可以肯定的是静态数据将不会像预期的那样被共享(我不会惊讶地发现一些专业分布式缓存/ classloader counter-example ...)。 – 2010-11-01 19:12:37

这取决于您的应用程序容器和配置。

静态成员对于在JVM实例中运行的所有会话都是相同的,但是您的配置可能正在创建多个实例。

如果你想保持这种一致性和便携性,你不应该依赖它在所有会话中都是相同的。如果需要,这也可以允许您扩展到多台机器,而无需更改此代码。

+1

-1不正确;静态实例是每个类加载器,而不是每个应用程序/ JVM – sleske 2010-11-01 18:56:56

+0

好点,这就是我的意思,但输入了错误的东西。感谢您的纠正,看起来像别人有一个答案。 – 2010-11-01 18:57:57