【问题标题】:java change an Integer in an external method and have it affect original methodjava在外部方法中更改整数并影响原始方法
【发布时间】:2017-04-06 09:48:50
【问题描述】:

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

问题

我有方法 A,它调用方法 B,传递给它一个 int 值(例如 int value = 5)。我希望 B 查看 int 值,如果它 > 0,则将其减 1(例如:int value = 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. remainder 使用静态变量
  2. 编写一个自定义对象,其中包含布尔值和“remainder”的已更改 int 值
  3. 需要我实例化“测试”的解决方案
  4. 要求我失去 isRemainder0 回报的解决方案

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

【问题讨论】:

  • 要么使其成为成员变量,要么让方法返回一个 int 并将余数重新分配给返回的值
  • @XtremeBaumer 解决方案 1 将强制我实例化对象,解决方案 2 将意味着我将失去布尔值的返回(这与我正在编写的使用“ isRemainder0")。
  • 那么你应该在你的问题中准确地说出来
  • 使用 AtomicInteger 代替。
  • Java 是 Pass-By-Value。你必须想办法解决这个问题。顺便提一句。有一个名为 isRemainder0 的方法修改传递的值也不是很好的编码风格。

标签: java reference static-methods


【解决方案1】:

创建一个返回余数价格的方法,例如:

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

在打印之前添加调用:

remainder = setRemainder(remainder);

【讨论】:

  • 虽然它可以解决问题,但目标是在外部方法中一次优雅地做两件事 - 布尔值的返回与 remainder 的更改捆绑在一起,否则使外部方法将不是必需的。这是为了减少我正在编写的需要完成这两件事的一些实际代码中所需的代码量。
【解决方案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。谢谢mrjink!我还学到了一些新东西:)

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

【讨论】:

  • 问题明确指出:“我想避免的解决方案:2.编写一个自定义对象,其中包含布尔值和“remainder”的更改 int 值”
  • 使用 AtomicInteger 或像 mrjink 和 xander 提议的自定义可变包装器似乎是要走的路,虽然仍然不像我喜欢的那样简单,但它仍然使代码有点简单做我想做的事。
【解决方案3】:

这是我想出的解决方案:

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

【讨论】:

  • 嗯... 我想避免的解决方案:1.使用静态变量作为余数 由于余数被传递给isRemainder0(int),你可以从那里保存它而不是使用两种方法
  • 是的,很抱歉,我在找到解决方案后才看到它,但无论如何还是想分享它
猜你喜欢
  • 2013-03-29
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多