【问题标题】:Why there is no local static variable in Java?为什么Java中没有局部静态变量?
【发布时间】:2012-08-29 18:08:40
【问题描述】:

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

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

【问题讨论】:

  • 您的用例是什么?一般来说,静态数据成为对象状态的一部分是有意义的。
  • @Richard - 是的,这并不奇怪......只是不同。
  • @Rafi - 询问有关现有语言设计的“为什么”问题通常是毫无意义的……除非您打算设计和实现一种新语言。 Java 语言的行为方式就是这样,您需要相应地调整您的使用方式……或使用不同的语言。
  • 问为什么也是一个很好的方法来确定您是否缺少一个很好的替代您想要的功能,或者至少是您可能不了解或完全理解的功能。
  • 我宁愿语言新手问一个很好的“为什么”问题并尝试学习新技巧,而不是默默地被激怒并且什么也不学。通过在 Stack Overflow 上提问,Google 搜索结果中会出现好的答案,让一周后想知道同样事情的人受益。

标签: java oop static


【解决方案1】:

你找到了唯一的解决办法。

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

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

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

更容易理解/维护/等等。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          实例方法由类的实例(对象)调用。静态事物属于类而不属于对象,这就是局部变量不是静态的原因。实例变量是静态的,它们也可以在类加载时由静态块初始化。 enter image description here

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

          【讨论】:

          • 我建议您将图片放在答案正文中,而不是放置链接。
          猜你喜欢
          • 2010-09-29
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          • 2018-04-18
          • 2021-05-29
          • 2016-02-01
          相关资源
          最近更新 更多