java 在外部方法中更改一个整数并使其影响原始方法

java change an Integer in an external method and have it affect original method

我正在为我目前正在独自完成的一本书的练习编写一些代码,我在将一些工作代码重写为更易读的代码时偶然发现了一个问题。

问题

我有调用方法 B 的方法 A,向它传递一个 int 值(例如 int 值 = 5)。我希望 B 查看 int 值,如果它 >0,则将其递减 1(例如:int value = 4)和 return 布尔值 true 如果 int 值 > 0。但是我还希望 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);
    }
}

我想要的是 return 5 - false - 4. 这是做什么的 return:

5
false
5

为什么这不起作用

显然,如果您传递包含对象引用的变量 var1,则不会传递 var1,而是将它的副本 var2 == var1 传递给新方法。因此,在新方法中对 var2 的更改不会影响 var1。

问题

我如何找到绕过它的方法?

我想避免的解决方案

  1. remainder
  2. 使用静态变量
  3. 正在编写一个自定义对象,其中包含 "remainder"
  4. 的布尔值和更改后的 int 值
  5. 需要我实例化的解决方案"Test"
  6. 要求我丢失 isRemainder0
  7. 的 return 的解决方案

1) 我想避免,因为我目前正在尽可能避免使用静态变量。 2)我想避免因为在我看来它喜欢糟糕的编码。

这也不是一个好的设计,但你可以return一个数组:

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

制定一个方法 return 剩余价格如:

private static Integer setRemainder(Integer remainder){
    if (remainder > 0) {
        remainder = remainder - 1;
    }
    return remainder;
}

并在打印之前添加调用:

remainder = setRemainder(remainder);

这是我想出的解决方案:

public class JavaApplication1 {
static int remainder = 0;
public static void setRemainder(int value){
    remainder = value;
}
private static boolean isRemainder0() {
    boolean is0 = true;
    if (remainder > 0) {
        remainder = remainder - 1;
        is0 = false;
    }
    return is0;
}

public static void main(String[] args) {
    setRemainder(5);

    System.out.println(remainder);
    System.out.println(isRemainder0());
    System.out.println(remainder);
}

}

解决方案就是你想看到的: 5个 错误的 4