为什么Java中没有本地静态变量?

在C / C ++中,我们使用静态局部变量来维护方法的状态。 但是为什么Java不支持它?

是的,我可以为此目的使用静态字段。 但创建一个只保留一个方法状态的字段是不是有点奇怪?

你找到了唯一的解决方案。

Java从C ++中删除了许多复杂性,这就是其中之一。

作用于函数的静态变量在并发中给你带来了令人讨厌的东西(例如strtok是一个与pthreads一起使用的着名的东西,正是出于这个原因)。

一般来说,你想要的是一个有状态的对象。 那么有问题的函数应该有一个对象级变量。 然后,您可以创建每个维护状态的实例。

更容易理解/维护/等。

如果你真的需要将状态保持为单例,那么就是静态字段。

Java语言规范似乎没有捍卫与C static变量相对应的变量的遗漏。

从Java角度看,在类方法中隐藏状态有一些缺点。 通常,函数级静态变量的存在不是您希望在该函数之外公开的那种实现细节。

但是方法的状态实际上是类的状态的一部分,并且只要持久化对象,就必须对方法级静态变量进行序列化/反序列化。 这可能听起来不太常见,来自C背景,所以我会注意一些常见的例子。

  • 应用程序服务器群集可以在节点之间传递用户会话对象,以提供容错。
  • JAXB可用于将对象编组为XML文档
  • JPA可用于将对象状态持久保存到数据库

如果在持久化对象时值变量的值值得保存的,那么该类之外的代码很可能需要引用该值。 突然间这意味着定义访问级别 – 公共方法中的静态变量是否自动公开? 或者程序员是否必须声明它?

我们还必须考虑可扩展性。 派生类是否需要实现相同的静态变量? 或者是否会引用基类中函数的变量?

使用静态局部变量的C方法更可能是Java中类的一个很好的候选者。 它有国家,希望存在于一个目的。 将function封装到对象中没有什么缺点,它使瞬态值(例如局部变量)和更长期状态之间的分离更加清晰。

其他一些答案显示了为什么你可能不想拥有它。 但你也可以从历史的角度来问问为什么。

要回答这个问题,你必须开始明白为什么C确实有静态局部变量。 C比Java和C ++更少地限制变量的范围,静态数据的唯一选项是“文件内部”和“无处不在”。 因此,这提供了一个额外的层,以限制范围。

C ++的一个重要方面是兼容性,因此它也允许在C ++中使用。 但它不再需要本地静态范围,因为还有许多其他方法可以限制静态数据的范围。 这种用法在(现代)C ++中并不流行。

Java只是从C / C ++中获取了很多灵感,它不必担心向后兼容性,因此可能会被遗漏。

也许因为方法不是Java中的对象; 所以保持他们所说的状态没有多大意义,我想你必须在字节代码中创建一个新的概念; Tony K.说,使用一个物体。