使用静态字符串变量的Java类

使用静态字符串变量的Java类,java,class,static,Java,Class,Static,在这里,我有点困惑,正在构建一个带有标签页的web应用程序。在tab sheet类中,我使用数据成员-静态字符串变量来存储用户选择的选项卡。我这样做是为了在用户返回选项卡工作表时显示用户上次选择的选项卡。我正在得到理想的结果。但是,如果我注销并登录(在删除浏览器上的缓存后),选项卡工作表仍会选择用户上次选择的选项卡,而不会选择默认选项卡。选项卡页正在由另一个组件初始化。我不明白的是,类定义不是垃圾收集的吗?为什么要挑选旧数据?如何解决此问题?静态成员是按类存储的,而不是按对象存储的,因此静态成员

在这里,我有点困惑,正在构建一个带有标签页的web应用程序。在tab sheet类中,我使用数据成员-静态字符串变量来存储用户选择的选项卡。我这样做是为了在用户返回选项卡工作表时显示用户上次选择的选项卡。我正在得到理想的结果。但是,如果我注销并登录(在删除浏览器上的缓存后),选项卡工作表仍会选择用户上次选择的选项卡,而不会选择默认选项卡。选项卡页正在由另一个组件初始化。我不明白的是,类定义不是垃圾收集的吗?为什么要挑选旧数据?如何解决此问题?

静态成员是按类存储的,而不是按对象存储的,因此静态成员的值在所有类实例(对象)中都是相同的,并且在实例超出范围时不会“重置”。以这种方式使用静态成员是个坏主意,因为应用程序的所有用户都将看到相同的值,如果其中一个用户导致该值发生更改,则更改后的值将对所有人可见(即,如果用户1更改选项卡,则所有其他用户的选项卡也将更改)。

静态成员按类存储,而不是按对象存储,因此,静态成员的值在所有类实例(对象)中都是相同的,并且在实例超出范围时不会得到“重置”。以这种方式使用静态成员是个坏主意,因为应用程序的所有用户都将看到相同的值,如果其中一个用户导致该值发生更改,则更改后的值将对所有人可见(即,如果用户1更改选项卡,则所有其他用户的选项卡也将更改).

您似乎假设使变量成为静态变量某种程度上对应于将其隔离到用户会话。没有

如果您想要任何类型的会话处理,您必须实际拥有一个会话。(您需要考虑服务器重启、多个服务器等发生的事情)

当您有一个静态变量时,它是该类在类装入器中的一个变量。它与用户无关。如果所有用户访问同一台服务器,他们将看到相同的变量


您还没有告诉我们您正在使用什么技术来构建web应用程序,但基本上您应该了解服务器端用户会话为您提供了什么,或者使用隐藏字段或类似内容传播信息,因此,服务器根本不需要跟踪它。

您似乎假设,创建变量static某种程度上对应于将其隔离到用户会话。没有

如果您想要任何类型的会话处理,您必须实际拥有一个会话。(您需要考虑服务器重启、多个服务器等发生的事情)

当您有一个静态变量时,它是该类在类装入器中的一个变量。它与用户无关。如果所有用户访问同一台服务器,他们将看到相同的变量


您还没有告诉我们您正在使用什么技术来构建web应用程序,但基本上您应该了解服务器端用户会话为您提供了什么,或者使用隐藏字段或类似内容传播信息,因此服务器根本不需要跟踪它。

仅仅因为清除了浏览器缓存,它不会影响服务器上存储静态变量的对象。如果用户注销(或登录,由您选择),则需要显式重新设置它。

仅因为您清除了浏览器缓存,它不会影响存储静态变量的服务器上的对象。如果用户注销(或登录,由您选择),则需要显式重新设置该值。

如果值不断变化,则该值不是静态的。我认为您应该考虑使用不同的机制来存储这些类型的变量

如果值不断变化,则它不是静态的。我认为您应该考虑使用不同的机制来存储这些类型的变量

向我们展示您的代码会很有帮助,但我认为您的问题在于使用
静态
范围成员,它是该类实例之间共享的成员,就像类的每个实例都可以更改的类全局成员一样。这与垃圾收集无关,而与程序中的错误有关。首先,不要使用静态变量,而是只使用实例变量。您在此处使用静态的理由是错误的。向我们展示您的代码可能会有所帮助,但我认为您的问题在于使用
静态
范围成员,该成员是该类实例中共享的成员,就像一个可以被类的每个实例更改的全局类。这与垃圾收集无关,而与程序中的错误有关。首先,不要使用静态变量,而是只使用实例变量。你在这里使用静力学的理由是错误的。