1

我目前正在查看一位同事的一些代码,并发现了我以前从未见过的递归用法。

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

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();
    }
}

当我使用递归时,我会将所有需要的变量作为参数提供,然后返回一个返回值,或者使用其中一个参数来提供一个可以写入结果的容器对象。这样每个递归都有它自己的要处理的数据范围。

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

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

brgds,

Ĵ

4

4 回答 4

2

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

编辑

@Itay 让我意识到,“同时”这个词在这里是错误的——在“不合作或不了解彼此”的意义上,它应该是“竞争性”。对不起,德语(我的母语)单词“Konkurrenz”和英语单词“Concurrency”的含义略有不同。

/编辑

如果能保证这一点,放入mValue类作用域而不是局部作用域,可以提高局部性和缓存命中率,还可以消除一些参数传递——总而言之,它会以封装的方式获得一些性能增益。

于 2012-12-06T11:28:44.490 回答
1

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

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

于 2012-12-06T11:29:53.290 回答
0

如果递归方法将在同一个实例上被调用两次,这可能是一个问题?

于 2012-12-06T11:26:34.770 回答
0

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

在实践中,它不是实现递归的首选方式。

条件(mValue < MAX)只能在递归方法中受到影响。如果没有,您的递归可能会意外结束。

于 2012-12-06T11:30:54.660 回答