在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,你能详细说明一下吗?我不确定我是否理解你所说的特定于逻辑的意思,我确实想理解这个问题出了什么问题。