在C / C ++中,我们使用静态局部变量来维护方法的状态。但是为什么Java不支持它?
是的,我可以为此目的使用静态字段。但创建一个只保留一个方法状态的字段是不是有点奇怪?
答案 0 :(得分:34)
您找到了唯一的解决方案。
Java从C ++中删除了许多复杂性,这就是其中之一。
作用于函数的静态变量在并发中给你带来了令人讨厌的东西(例如strtok是一个与pthreads一起使用的着名的错误,正是出于这个原因)。
一般来说,你想要的是一个有状态的对象。那么有问题的函数应该有一个对象级变量。然后,您可以创建每个维护状态的实例。
更容易理解/维护/等。
如果你真的需要将状态保持为单例,那么就是静态字段。
答案 1 :(得分:5)
Java语言规范似乎没有捍卫与C static
变量对应的变量的遗漏。
从Java角度看,在类方法中隐藏状态有一些缺点。通常,函数级静态变量的存在不是您希望在该函数之外公开的那种实现细节。
但是方法的状态实际上是类的状态的一部分,并且只要持久化对象,就必须对方法级静态变量进行序列化/反序列化。这可能听起来不太常见,来自C背景,所以我会注意一些常见的例子。
如果在持久化对象时变量的值 值得保存,那么该类之外的代码很可能需要引用该值。突然间,这意味着定义访问级别 - 公共方法中的静态变量是否自动公开?或者程序员是否必须声明它?
我们还必须考虑可扩展性。派生类是否需要实现相同的静态变量?或者是否会引用基类中函数的变量?
使用静态局部变量的C方法更可能是Java中类的一个很好的候选者。它有国家,希望存在于一个目的。将功能封装到对象中没有什么缺点,它使瞬态值(例如局部变量)和更长期状态之间的分离更加清晰。
答案 2 :(得分:1)
其他一些答案显示了您可能不希望这样做的原因。但你也可以从历史角度问问为什么。
要回答这个问题,你必须开始明白为什么C确实有静态局部变量。 C比Java和C ++更少的方法来限制变量的范围,静态数据的唯一选项是在文件内部'到处都是'因此,这提供了一个额外的层,以限制范围。
C ++的一个重要方面是兼容性,因此它也允许在C ++中使用。但它不再需要本地静态范围,因为还有许多其他方法可以限制静态数据的范围。这种用法在(现代)C ++中并不流行。
Java只是从C / C ++中获取了很多灵感,它不必担心向后兼容性,因此可能会被遗漏。
答案 3 :(得分:0)
也许因为方法不是Java中的对象;所以保持他们所说的状态没有多大意义,我想你必须在字节代码中创建一个新的概念;像Tony K.说的那样使用一个物体。
答案 4 :(得分:-1)
实例方法由类的实例(对象)调用。静态事物属于类而不是对象,这就是局部变量不是静态的原因。实例变量是静态的,它们也可以在由静态块加载类时进行初始化。 enter image description here
有关更多信息,请访问:-https://www.youtube.com/watch?v=GGay1K5-Kcs&t=119s