我有以下两个函数,我需要在第二个函数中设置一个布尔值,但我需要稍后在调用函数中使用该值。
限制:
实现这一目标的最有效,最干净的方法是什么?
private void F1()
{
boolean foo = false;
List<String> result = F2(foo);
if(foo)
{
// do something
}
}
private List<String> F2(boolean foo)
{
// Logic to set the result
List<String> result = new ArrayList();
if(condition)
{
foo = true;
}
return result;
}
答案 0 :(得分:3)
您可以在boolean
周围使用可变包装器来模拟传递引用。 AtomicBoolean
可以为此目的重新拨款。你不会将它用于它的原子性,只能在一个函数中设置它的值并在另一个函数中读取它。
private void F1()
{
AtomicBoolean foo = new AtomicBoolean(false);
List<String> result = F2(foo);
if(foo.get())
{
// do something
}
}
private List<String> F2(AtomicBoolean foo)
{
// Logic to set the result
List<String> result = new ArrayList();
if(condition)
{
foo.set(true);
}
return result;
}
另一种常见的,甚至是更为常见的方法是使用1元素阵列。
boolean[] foo = new boolean[] {false};
同样的伎俩适用。 F2
会做
foo[0] = true;
这很丑陋,但你不时会看到它,因为嘿,有时你必须做你必须做的事。
答案 1 :(得分:1)
分配foo
完全没用,因为这不会反映在调用方法中。
但是有几种方法可以达到相同的结果:
使用数组:
private void F1() {
boolean foo[] = new boolean[1];
List<String> result = F2(foo);
if(foo[0]) {
// do something
}
}
private List<String> F2(boolean[] foo) {
// Logic to set the result
List<String> result = new ArrayList();
if(condition) {
foo[0] = true;
}
return result;
}
或任何其他可以保存值而不更改其引用的结构(AtomicBoolean
就是一个例子)。
更改处理返回值的方式:
private void F1() {
List<String> result = F2();
if(result != null) {
// do something
}
}
private List<String> F2() {
// Logic to set the result
List<String> result = new ArrayList();
if(condition) {
return result;
}
return null;
}
返回null
,其中Object
是预期的,这是指示出现问题并且结果不被视为有效的常用方法。不要误以为空的结果List,这可能表明一切都很好,没有什么可以返回。
抛出异常:
private void F1() {
try {
List<String> result = F2();
// do something
} catch (Exception e) {
e.printStackTrace();
}
}
private List<String> F2() {
// Logic to set the result
List<String> result = new ArrayList();
if(!condition) {
throw new Exception("Condition not met");
}
return result;
}
此处可以是已检查或未检查的异常,具体取决于您想要的效果。也常用,例如表示输入不正确,由于外部原因(I / O)而出现一些错误,系统处于不允许此操作的状态......