在Java中第一次调用函数时保存参数值

在Java中第一次调用函数时保存参数值,java,Java,假设我有一个带有某个参数的函数,我想在第一次调用该函数时保存该参数的值。最明显的方法是使用布尔标志: boolean functionAlreadyCalled = false; int firstArgument = 0; void func(int argument) { if (!functionAlreadyCalled) { firstArgument = argument; functionAlreadyCalled = true; } } 有

假设我有一个带有某个参数的函数,我想在第一次调用该函数时保存该参数的值。最明显的方法是使用布尔标志:

boolean functionAlreadyCalled = false;
int firstArgument = 0;

void func(int argument) {
   if (!functionAlreadyCalled) {
      firstArgument = argument;
      functionAlreadyCalled = true;
   }
}

有没有一种更优雅的方法(可能是Java特有的)来做到这一点,而不需要使用额外的变量?

使用Integer而不是int,并检查属性值是否为null

Integer firstArgument = null;

void func(int argument) {
   if (firstArgument == null) {
      firstArgument = argument;
   }
}

首先请参见,这取决于您是希望在创建新对象时进行初始化,还是一次性进行初始化,即,如果一次初始化,则为每个对象设置相同的值。因此,为这两种情况编写解决方案

第一种方法:-

public class ArgumentTest {
    boolean functionAlreadyCalled = false;
    int firstArgument = -1;

    public ArgumentTest(int i){
        func(i);
    }

    public static void main(String... q){
        ArgumentTest arg = new ArgumentTest(1);
        ArgumentTest arg1 = new ArgumentTest(2);
    }

    void func(int argument) {
        if (!functionAlreadyCalled) {
          firstArgument = argument;
            System.out.println("Initialization Called");
          functionAlreadyCalled = true;
        }
    }
}
这将产生以下输出:-

运行:

初始化调用

初始化调用

第二种方法:-

public class ArgumentTest {

    private static volatile ArgumentTest arg = null;
    boolean functionAlreadyCalled = false;
    int firstArgument = -1;

    private ArgumentTest(int i){
        func(i);
    }

    public static ArgumentTest getArgumentTest(int i){
        if(arg == null){
            arg = new ArgumentTest(i);
        }

        return arg;
    }

    public static void main(String... q){
        ArgumentTest arg = getArgumentTest(1);
        ArgumentTest arg1 = getArgumentTest(2);
    }

    void func(int argument) {
        if (!functionAlreadyCalled) {
          firstArgument = argument;
            System.out.println("Initialization Called");
          functionAlreadyCalled = true;
        }
    }
}
鉴于此:-

运行:调用初始化


你为什么认为这是非常错误的?它不是线程安全的,等等。但是OP没有解释上下文。@PacoAbato-Ok。我本不该如此一丝不苟。如果其他方法需要使用
firstArgument
,该怎么办?并改变它的值?。此外,拳击价值观并不总是一件好事。您通常会给它另一个选项(
null
),因此OP必须在使用它的所有位置检查
firstArgument
null
值(`unboxing可能会给出NPE)。这实际上需要大量的代码更改。我强烈建议使用一个单独的标志/指示器,而不是根据程序在许多地方需要的值得出结论。@venouse-答案在于使用了多少其他地方
firstArgument
。如果在
func()
之前调用了
methodX
,并且它以int作为参数,则需要额外的null检查。根据经验法则,除非有必要(集合),否则请始终使用原语而不是其装箱类型。在这种情况下,Java 8中的新类可能是一个有趣的功能。@请注意,如果在初始化之前尝试分配它,我更喜欢NPE而不是无声的错误值。您的问题是特定于逻辑的,可以通过多种方式设置。所以你的问题可以有多个答案,你需要使用最相关的答案。你能提供一些你为什么要这样做的信息吗?很可能有更好的方法来实现你想要的。sprinter,我有一个游戏代理类,它在游戏之外初始化,并在某个时刻进入游戏。进入游戏时,它必须记住游戏的一些参数。vikeng21,你能详细说明一下吗?我不确定我是否理解你所说的特定于逻辑的意思,我确实想理解这个问题出了什么问题。