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

Raf*_*mal 21 java oop static

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

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

Ton*_* K. 34

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

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

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

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

更容易理解/维护/等.

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


Gar*_*het 5

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

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

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

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

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

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

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