如何在调用时使静态属性评估

时间:2017-12-21 21:21:19

标签: java

在类中内联声明时,Java是否只调用一次声明的变量?每当我打电话时,如何更新?

https://ideone.com/3WUWyO

public class MyClass {

    private static int level = 0;

    private boolean levelInline = (10 <= level);
    private boolean levelFunction = less(10,level);


    public static void main(String args[]) {

        level = 10;


       if (levelInline) {
           System.out.println("Inline True");
       }

       if (levelFunction) {
           System.out.println("Function True");
       }


        levelInline = (10 <= level);

        if (levelInline) {
            System.out.println("InLine True");
        }

        if (levelFunction) {
           System.out.println("Function True");
       }


    }

    private static boolean less(int a, int b) {
        return (a <= b);
    }


}

我希望每次查询levelInLinelevelFunction时,都要再次评估相关的右表达式。即我的预期出局将是:

Inline True
Function True
Inline True
Function True

我正在尝试做什么,而不是这个:

 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;

我正试图跳过必须在自己的变量中保持幻数的步骤 - 尽管将数字直接与布尔值相比更有意义,因此使它更整洁,更容易维护。 / p>

3 个答案:

答案 0 :(得分:2)

这不是Java变量的工作原理。一旦为变量(或成员)分配了值,它就只是一个值。它没有关于如何计算该值的“记忆”,并且在您访问它时不会重新计算。如果要重新计算该值,则应定义方法:

private static boolean levelFunction() {
    return less(10, level);
}

并在需要时调用它:

if (levelFunction()) {
    System.out.println("Function True");
}

答案 1 :(得分:2)

您可以使用“功能界面”和lambdas

来估算您想要的内容
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));

}

这声明了一个匿名类型,它实现Function获取Integer参数并返回Boolean,实现为lambda。然后,您可以通过调用其apply()方法来执行它。

阅读Oracle Java教程中的“Functional Interface”和“lambda”。

正如@Aominè所建议的(谢谢)

public static IntPredicate levelInline = (int level) -> 10 <= level;
...
int level = 5;
System.out.println(levelInline.test(level));

答案 2 :(得分:1)

java中的static是在类级别,这意味着它们在加载类时会得到评估。

在您的情况下,当类加载时,level设置为0,levelInLine = false,levelFunction设置为false。这将保留这些值,直到您更改它。

然后运行main()方法,由于上述原因,将跳过前2个if语句。

然后再次更改levelInLine,这次将设置为true。

因此,第38行中的下一个if语句将导致打印输出。但是下一个if语句不会打印,因为此时levelFunction仍然是假的。