Java 调用时如何进行静态属性求值
Java在类中内联声明时是否只调用一次声明的变量?我怎样才能让它在我调用时更新 我想做的不是这个:Java 调用时如何进行静态属性求值,java,Java,Java在类中内联声明时是否只调用一次声明的变量?我怎样才能让它在我调用时更新 我想做的不是这个: int debugLevel = 0; int levelToDoX = 5; int levelToDoY = 8; int levelToDoZ = 10; boolean DoX = debugLevel >= levelToDoX; boolean DoY = debugLevel >= levelToDoY; boolean DoZ = debugLevel &
int debugLevel = 0;
int levelToDoX = 5;
int levelToDoY = 8;
int levelToDoZ = 10;
boolean DoX = debugLevel >= levelToDoX;
boolean DoY = debugLevel >= levelToDoY;
boolean DoZ = debugLevel >= levelToDoZ;
请注意:
int debugLevel = 0;
boolean DoX = debugLevel >= 5;
boolean DoY = debugLevel >= 8;
boolean DoZ = debugLevel >= 10;
我试图跳过在他们自己的变量中维护幻数的步骤——我认为直接将数字与布尔值一起使用更有意义,从而使它更整洁、更易于维护。这不是Java变量的工作方式。一旦给变量或成员赋值,它就是一个值。它没有关于这个值是如何计算的内存,当您访问它时,它不会被重新计算。如果要重新计算该值,应定义一种方法:
private static boolean levelFunction() {
return less(10, level);
}
并在需要时呼叫:
if (levelFunction()) {
System.out.println("Function True");
}
这不是Java变量的工作方式。一旦给变量或成员赋值,它就是一个值。它没有关于这个值是如何计算的内存,当您访问它时,它不会被重新计算。如果要重新计算该值,应定义一种方法:
private static boolean levelFunction() {
return less(10, level);
}
并在需要时呼叫:
if (levelFunction()) {
System.out.println("Function True");
}
java中的静态是类级别的,这意味着在加载类时对它们进行评估 在您的例子中,当类加载时,level设置为0,levelInLine=false,levelFunction设置为false。这将保留这些值,直到您更改它 然后运行main方法,出于上述原因,将跳过前2个if语句 然后再次更改levelInLine,这次将设置为true
因此,第38行中的下一个if语句将导致打印输出。但是下一个if语句将不会打印,因为此时levelFunction仍然为false。java中的静态是类级别的,这意味着在加载类时对它们进行计算 在您的例子中,当类加载时,level设置为0,levelInLine=false,levelFunction设置为false。这将保留这些值,直到您更改它 然后运行main方法,出于上述原因,将跳过前2个if语句 然后再次更改levelInLine,这次将设置为true
因此,第38行中的下一个if语句将导致打印输出。但是下一个if语句将不会打印,因为此时levelFunction仍然为false。您可以使用函数接口和lambda来近似您想要的内容
public static Function<Integer,Boolean> levelInline = (Integer level) -> 10 <= level;
public static void main(String[] args) throws Exception
{
int level = 5;
System.out.println(levelInline.apply(level));
level = 10;
System.out.println(levelInline.apply(level));
}
您可以使用功能接口和lambda来近似您想要的内容
public static Function<Integer,Boolean> levelInline = (Integer level) -> 10 <= level;
public static void main(String[] args) throws Exception
{
int level = 5;
System.out.println(levelInline.apply(level));
level = 10;
System.out.println(levelInline.apply(level));
}
你能澄清一下要求吗?你想要得到什么样的输出?我希望所有的调用都是真的。i、 每次我说levelFunction,它实际上调用的更少,并且进行计算。我可能弄错了,但我记得C是这样工作的。字符串调用函数?不太可能。我通常擅长这些游戏,但我甚至猜不出你的实际意思,或者你的例子是如何体现它的。你可以用一个函数来定义它。@JohnBollinger对不起,我的意思是提供一个例子,说明我习惯了这一点。例如,我可能经常使用:String HOME=FileSystemView.getFileSystemView.gethomeditory.getAbsolutePath-我感觉每次使用HOME时它都会调用这个字符串。您能澄清一下要求吗?你想要得到什么样的输出?我希望所有的调用都是真的。i、 每次我说levelFunction,它实际上调用的更少,并且进行计算。我可能弄错了,但我记得C是这样工作的。字符串调用函数?不太可能。我通常擅长这些游戏,但我甚至猜不出你的实际意思,或者你的例子是如何体现它的。你可以用一个函数来定义它。@JohnBollinger对不起,我的意思是提供一个例子,说明我习惯了这一点。例如,我可能经常使用:String HOME=FileSystemView.getFileSystemView.gethomeditory.getAbsolutePath-我感觉每次使用HOMESo时它都会调用这个字符串。感谢为什么,就这样吧。理解为什么。这是我读这个问题时的最初想法+1和顺便说一句,使用公共静态IntPredicate levelInline=level->10 IntPredicate与函数相比,消除了不必要的装箱和拆箱开销,尽管两者都可以完成这项工作。这是我在阅读问题时的最初想法+1和顺便说一句,使用公共静态IntPredicate levelInline=level->10 IntPredicate可以消除与函数相比不必要的装箱和取消装箱开销,尽管两者都可以完成这项工作。