我正在为一本书的练习编写一些代码,我目前正在自己读一遍,在将一些工作代码改写成更易读的东西时,我偶然发现了一个问题。
问题所在
我有一个调用方法B的方法A,向它传递一个int值(例如,int值=5)。我想让B查看int值,如果它>0,就减去1(例如:int值=4),如果int值>0,就返回一个布尔true
。但是,我还希望B中int值的更改影响A中的原始int值。由于这在使用原语的Java中不起作用,所以我想如果我传递一个integer
就可以解决我的问题了。
示例代码
public class Test {
private static boolean isRemainder0(Integer remainder) {
boolean is0 = true;
if (remainder.intValue() > 0) {
remainder = remainder.intValue() - 1;
is0 = false;
}
return is0;
}
public static void main(String[] args) {
Integer remainder = 5;
System.out.println(remainder);
System.out.println(isRemainder0(remainder));
System.out.println(remainder);
}
}
我想让它返回5-false-4。这会得到的回报是:
5
false
5
为什么这不起作用
显然,如果您传递一个包含对象引用的变量var1,您不是传递var1,而是传递它的副本var2==var1给新方法。因此,在新方法中对var2的更改不会影响var1。
这个问题
我该如何找到绕过它的方法?
我想避免的解决方案
1)我想要避免,因为我目前正在尽可能地避免使用静态变量。2)我想要避免,因为它在我看来像是糟糕的编码。
这也不是一个好的设计,但是您可以返回一个数组:
private static Object[] isRemainder0(Integer remainder) {
boolean is0 = true;
if (remainder.intValue() > 0) {
remainder = remainder.intValue() - 1;
is0 = false;
}
return new Object[]{is0, remainder};
}
public static void main(String[] args) {
Integer remainder = 5;
System.out.println(remainder);
Object[] result = isRemainder0(remainder);
System.out.println(result[0]);
remainder = (Integer)result[1];
System.out.println(remainder);
}
正如mrjink在注释中所建议的,您可以使用AtomicInteger。谢谢金克先生!我还学到了一些新的东西:)
private static boolean isRemainder0(AtomicInteger remainder) {
boolean is0 = true;
if (remainder.intValue() > 0) {
remainder.decrementAndGet();
is0 = false;
}
return is0;
}
public static void main(String[] args) {
AtomicInteger remainder = new AtomicInteger(5);
System.out.println(remainder);
System.out.println(isRemainder0(remainder));
System.out.println(remainder);
}
问题内容: 我有一个清单,我创建了一个清单以进行一些操作,同时仍保留原始清单。但是,当我设置copy_list等于时,它们将变为同一事物,并且如果我更改,它们也会更改。例如: 退货 我对实际发生的事情不太了解,但看起来org_list实际上是将自身传递给copy_list他们,因此它们实际上是同一回事。 有没有一种方法可以制作org_list的独立副本,而又不需要做一些笨拙的事情: 我之所以这样说
我对变量的作用域有问题。 我希望输出为,但结果是。为什么我在方法中改变了数组中的值,而原来的数组却改变了?
问题内容: 我希望将外部参数传递给方法引用: 我不知道该怎么做。我可以用lambda做到这一点: 是否可以将外部参数传递给方法引用? 问题答案: 不可以,您不能将参数传递给方法引用。您可以做的是创建一个返回a的方法: 然后,它将用作创建工厂的工厂,您可以将其传递给: 您甚至可以使它更通用一些,创建一个将a 作为参数的方法,这样,如果您愿意,可以传入另一个参数: 例如,您可以通过以下方法使用它:
问题内容: 我在变量范围方面遇到麻烦。 我期望输出到,但结果是。为什么我在方法中更改了数组中的值,但是原来的数组却更改了? 问题答案: Java中的数组是一个对象。当您通过创建数组时,它是在堆上创建的,并且返回一个参考值(类似于C中的指针)并将其分配给您的变量。 在C语言中,这表示为: 当您将该变量传递给方法时,您将传递给该方法中的局部(堆栈)变量分配(复制)的参考值。不会复制数组的内容,仅复制参
本文向大家介绍JavaScript更改原始对象valueOf的方法,包括了JavaScript更改原始对象valueOf的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript更改原始对象valueOf的方法。分享给大家供大家参考。具体分析如下: JS中的对象都包含valueOf方法,我们可以通过自定义valueOf函数替换掉原始object的valueOf 希望本文所述
本文向大家介绍PHP实现函数内修改外部变量值的方法示例,包括了PHP实现函数内修改外部变量值的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现函数内修改外部变量值的方法。分享给大家供大家参考,具体如下: 直接上代码,如下: 运行结果: ab ababc #################### ab abc #################### ab ababc 总结