我目前正在审查一位同事的一些代码,并发现了一种我从未见过的递归用法。
我减少了它,所以他基本上做的是:
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,
Ĵ
答案 0 :(得分:2)
只要Test
类的单个实例不会同时运行.test()
,这将按预期工作。
修改强>
@Itay让我意识到,“同时”这个词在这里是错误的 - 它应该是“竞争性地”在“不与彼此合作或不相互了解”的意义上。对不起,德语(我的母语)单词“Konkurrenz”和英语单词“Concurrency”的含义略有不同。
<强> /修改
如果这是有保证的,将mValue
放在类范围而不是本地范围中可以提高局部性和缓存命中率,也可以删除一些参数传递 - 总而言之,它会对封装进行一些性能提升。
答案 1 :(得分:1)
只要您的逻辑是线程安全的(不可变对象或包含相关锁定),即使发生递归,也没有理由严格优先于全局类'字段上的参数。
当然,只要相关字段代表对象的状态而不是简单的丑陋辅助变量......
答案 2 :(得分:0)
如果在同一个实例上调用两次递归方法,可能会出现问题吗?
答案 3 :(得分:0)
这会导致任何错误吗?对象中有些不一致吗?
实际上,它不是实现递归的首选方法。
条件(mValue < MAX)
只应在递归方法中受到影响。如果没有,你的递归可能会无意中结束。