21

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

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

4

5 回答 5

35

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

Java 放弃了 C++ 的许多复杂性,这就是其中之一。

作用于函数的静态变量在并发的情况下会对你做一些讨厌的事情(例如,strtok 是一个众所周知的讨厌的变量,与 pthreads 一起使用,正是出于这个原因)。

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

更容易理解/维护/等。

如果您确实需要将状态保持为单例,那么静态字段就是它。

于 2012-09-05T04:15:26.030 回答
5

Java 语言规范似乎并没有为省略对应于 Cstatic变量的变量辩护。

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

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

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

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

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

使用静态局部变量的 C 方法更有可能成为 Java 中的类的良好候选者。它有状态并且希望存在于一个单一的目的。将功能封装到对象中几乎没有缺点,它可以更清晰地分离瞬态值(例如局部变量)和更长期的状态。

于 2012-09-05T05:01:13.707 回答
1

其他一些答案说明了为什么您可能不想拥有这个。但你也可以从历史的角度来问为什么。

要回答这个问题,您必须开始了解为什么 C 确实有静态局部变量。C 比 Java 和 C++ 限制变量范围的方法要少得多,静态数据的唯一选项是“文件内部”和“无处不在”。所以这提供了一个额外的层来限制范围。

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

Java 只是从 C/C++ 中汲取了很多灵感,它不必担心向后兼容性,因此可以省略。

于 2015-04-14T14:20:25.957 回答
0

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

于 2012-09-05T04:25:40.130 回答
-2

实例方法由类的实例(对象)调用。静态事物属于类而不属于对象,这就是局部变量不是静态的原因。实例变量是静态的,它们也可以在类加载时由静态块初始化。 在此处输入图像描述

欲了解更多信息,请访问:- https://www.youtube.com/watch?v=GGay1K5-Kcs&t=119s

于 2018-11-04T19:40:27.253 回答