在类中内联声明时,Java是否只调用一次声明的变量?每当我打电话时,如何更新?
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);
}
}
我希望每次查询levelInLine
和levelFunction
时,都要再次评估相关的右表达式。即我的预期出局将是:
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>
答案 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仍然是假的。