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

java更改外部方法中的整数并使其影响原始方法,java,reference,static-methods,Java,Reference,Static Methods,我正在为一本书的练习写一些代码,我目前正在独自完成这本书的练习,在将一些工作代码重写为可读性更强的代码时,我遇到了一个问题 问题 我有一个方法A,它调用方法B,给它传递一个int值(例如int值=5)。我希望B查看int值,如果大于0,则将其递减1(例如:int值=4),如果int值大于0,则返回布尔值true。但是,我也希望B中int值的更改影响A中的原始int值。由于这在java中不适用于原语,因此我认为如果我传递一个整数,我的问题将在这里得到解决 示例代码 public class Tes

我正在为一本书的练习写一些代码,我目前正在独自完成这本书的练习,在将一些工作代码重写为可读性更强的代码时,我遇到了一个问题

问题

我有一个方法A,它调用方法B,给它传递一个int值(例如int值=5)。我希望B查看int值,如果大于0,则将其递减1(例如:int值=4),如果int值大于0,则返回布尔值
true
。但是,我也希望B中int值的更改影响A中的原始int值。由于这在java中不适用于原语,因此我认为如果我传递一个
整数
,我的问题将在这里得到解决

示例代码

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

问题

我怎样才能找到一条绕过它的路

我想避免的解决方案

  • 对余数使用静态变量
  • 编写一个自定义对象,其中包含布尔值和更改后的int值“余数”
  • 需要我实例化“测试”的解决方案
  • 解决方案要求我无法返回ISremainder 0

  • 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。谢谢Jink先生!我也学到了一些新东西:)


    制作一种返回剩余部分价格的方法,如:

    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

    将其设为成员变量,或者让该方法返回int并将余数重新分配给该值returned@XtremeBaumer解决方案1将迫使我实例化该对象,解决方案2将意味着我将丢失布尔值的返回(这与我正在编写的使用“isremainder 0”的实际代码段相关).那么您应该确切地说,在您的问题中使用原子整数代替。Java是。你得想办法解决这个问题。顺便说一句,让一个名为isremainer0的方法修改传递的值也不是很好的编码风格。问题清楚地表明:“我想要避免的解决方案:2.编写一个自定义对象,其中包含布尔值和更改后的int值“rements”使用AtomicInteger或mrjink和xander建议的自定义可变包装器似乎是一种解决方法,尽管仍然没有我所希望的那么简单,但它使代码保持了某种程度的简单,同时仍能完成我希望它完成的任务。嗯。。。我要避免的解决方案:1.使用静态变量表示余数因为余数被传递到
    isremainder 0(int)
    ,所以您可以从那里保存它,而不是使用两种方法。很抱歉,我在找到解决方案后看到了它,但希望在解决问题时以任何方式共享它,我们的目标是在某种程度上优雅地在外部方法中同时做两件事-返回绑定在一起的布尔值和更改
    余数
    ,否则不需要使用外部方法。这是为了减少我正在编写的一些实际代码中所需的代码量,其中需要完成这两件事。
    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);
    }