如何在Java中创build静态局部variables?
我读过Java不像C / C ++那样支持static
局部variables。 现在,如果我想用一个局部variables来编写一个函数,其值应该在函数调用之间保持不变,那我该怎么做呢?
我应该诉诸使用实例variables?
你可以有一个静态的类variables,它将被保存在类的所有实例中。 如果那是你想要的。 如果不是,则使用实例variables,该实例variables仅在此对象的方法调用中保留。
public class Foo { static int bar; //set bar somewhere public int baz() { return 3 * bar; } }
我应该诉诸使用实例variables?
是的 – 毕竟,这是实例variables的用途。 它们在对象的方法的调用之间存储状态。 有静态类variables可以达到相同的结果,但可以使您的程序更耦合,更难以testing/模拟/维护。
如果要在函数调用之间重用variables值并将此variables与其他方法隔离,则应将其封装在一个对象中。 首先,定义一个只有“静态”variables和你需要的函数的类:
class MyFunctionWithState { private int myVar = 0; public int call() { myVar++; return myVar; } }
然后,从您的客户端代码:
class Foo { private MyFunctionWithState func = new MyFunctionWithState(); public int bar() { return func.call(); } }
现在,如果func
依赖于Foo
的内部状态,则可以通过call()
传递相关数据,或者传递Foo
一个实例,让函数调用相应的getter:
class MyFunctionWithState { private int myVar = 0; public int call( Foo f ) { myVar += f.getBaz(); return myVar; } } class Foo { private MyFunctionWithState func = new MyFunctionWithState(); public int bar() { return func.call( this ); } public int getBaz() { /*...*/ } }
局部variables是方法内部的variables。 只有方法可以访问这些variables。 你不能有一个静态局部variables,但你可以使用实例variables或类variables。
如果你的方法是静态的,默认情况下,这个方法的副本创build到所有的对象,不能进一步分解,因为局部variables限制他们只访问它们的方法。
要么你标记了一个不正确的答案,要么你实际上需要静态的类variables – 但是正确的答案基本上是Levit的,或者在技术上是所有答案的混合物。
对于像我这样的C背景的人来说,真正想要静态函数局部variables纯粹是为了超越全局variables的范围优势,似乎答案是你不能在Java中。 并不是没有像@paradigmatic这样的东西是与一个静态的全局和getter()类的实例是你正在运行你的函数的类的实例。
如果我怀疑你是以单例方式运行这个类的话,或者像一个程序员那样完全静态的,我们都是这样开始的,@Ellie P或@ user2626445的答案可以正常工作,因为没有其他实例会把你的全局搞乱。 但是为了实现我认为它应该是实际应该只是一个实例variables,这是一个全局的C语言。它们坚持跨函数调用,但允许您的函数以OO方式使用,所以多个实例可以保持自己的这个特定函数的持久variables。
就我个人而言,我可以像解决Hi-Tech C不允许函数位variables一样,通过在函数声明之上的文件中声明全局函数来解决这个问题。 那样的话,当我后来破解代码的时候,不太可能认为它是一个全局的东西,而且很容易被混淆 – 这不就是为什么我们封装了东西吗?
在以下示例中, count
行为与静态本地variables类似,您可以在C:
public class Foo { private int count = 0; public int getCount() { return count++; } }
没有其他语言支持的静态局部variables。 由于Java是非常“类”的,所以它试图将其引入到上下文中。 如果要模拟该行为,则使用仅由此方法使用的实例variables。 所以这对于不同的方法调用是静态的,而不是类本身。
final int intVar = 1; //将只被插入一次。 在方法中用作C ++静态局部variables。