当前位置: 首页 > 知识库问答 >
问题:

Java改变外部方法中的整数并使其影响原始方法

公沈浪
2023-03-14

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

问题所在

我有一个调用方法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. remaider
  2. 使用静态变量
  3. 编写包含布尔值和更改的int值“remailder”的自定义对象
  4. 需要实例化“测试”的解决方案
  5. 要求我丢失IsRemailder0
  6. 的返回的解决方案

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

共有1个答案

冯星阑
2023-03-14

这也不是一个好的设计,但是您可以返回一个数组:

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 总结