Java类静态成员的范围

时间:2010-11-01 18:47:48

标签: java class static member

我正在使用Java / JSP开发Web应用程序。 一个班级,比如学生,有一个静态成员 static private int _nextID;

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

2 个答案:

答案 0 :(得分:6)

在简单的情况下,您可以假设Student的多个实例将共享相同的静态nextID字段。但是,人们应该超越简单的案例(或者你没有的文件)。在这种情况下,除非从id计数器派生的实例nextID字段传播到更大的应用程序,其中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()...

答案 1 :(得分:0)

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

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

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