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 &

Java在类中内联声明时是否只调用一次声明的变量?我怎样才能让它在我调用时更新

我想做的不是这个:

 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可以消除与函数相比不必要的装箱和取消装箱开销,尽管两者都可以完成这项工作。