java中无局部变量的递归

java中无局部变量的递归,java,recursion,Java,Recursion,我目前正在审阅一位同事的一些代码,发现了一种以前从未见过的递归用法 我减少了,所以他基本上做的是: public class Main { static class Test { private static final int MAX = 10; private int mValue = 0; void test() { System.out.println( mValue ); mVa

我目前正在审阅一位同事的一些代码,发现了一种以前从未见过的递归用法

我减少了,所以他基本上做的是:

public class Main {
    static class Test {
        private static final int MAX = 10;

        private int mValue = 0;

        void test() {
            System.out.println( mValue );
            mValue++;
            if (mValue < MAX) {
                test();
            }
        }
    }

    public static void main( final String[] args ) {
        final Test test = new Test();
        test.test();
    }
}
公共类主{
静态类测试{
专用静态最终整数最大值=10;
私有int mValue=0;
无效测试(){
System.out.println(mValue);
mValue++;
if(mValue
当我使用递归时,我会将所有需要的变量作为参数,然后返回一个返回值,或者使用其中一个参数提供一个可以写入结果的容器对象。因此,每个递归都有自己的数据范围

我环顾四周,但网络上的每一个例子都是按照我的方式进行的

那么这会导致任何错误吗?对象中的一些不一致?这与调用操作成员变量的不同私有方法之间有区别吗

brgds


J

如果在同一实例上调用递归方法两次可能会出现问题?

只要
Test
类的单个实例从不同时运行
.Test()
,这将按预期工作

编辑

@它让我意识到,“同时”一词在这里是错误的——它应该是“竞争性的”,意思是“不合作或不了解对方”。对不起,德语(我的母语)单词“Konkurrenz”和英语单词“Concurrency”的意思稍有不同

/Edit


如果这是有保证的,那么将
mValue
放在类作用域而不是本地作用域中,可以提高局部性和缓存命中率,还可以删除一些参数传递-总的来说,它与封装相比可以获得一些性能增益。

只要逻辑是线程安全的(不可变对象或包含相关锁定),即使发生递归,也没有理由严格地选择参数而不是全局类的字段

当然,只要相关字段表示对象的状态,而不是简单的辅助变量

那么这会导致任何错误吗?对象中的一些不一致

实际上,它不是实现递归的首选方法


条件
(mValue
只应在from recursive方法中受影响。否则,您的递归可能会意外结束。

不仅并发,而且按顺序结束-如果您调用此方法两次,第二次运行将一事无成。除非这是必要的行为,否则可以认为这是一个问题。请原谅非英语母语人士:同时声明“彼此不合作”。我将编辑答案并使用“competingly”代替。大家好,谢谢回答。在我开始抱怨对对象的访问确实不是线程安全的之前,我想确保这基本上是正常的,这是我反对他的实现的主要观点。