核心Java这个简单语法有什么不对

时间:2016-01-19 11:45:27

标签: java final primitive

我有这样的代码。

public void test()
{
    final boolean passDay = true;
    final int status;
    //if the right side takes place means i need status value below and is set
    //if only the left side is takes place i dont care about status because i will not use it 
    if(!passDay && ((status=loadStatusValue()))== Constants.YORK_CORK_EMPTY_SET)
        System.out.println("inside 1");//I DONT CARE ABOUT STATUS VALUE
    else
    {
        if(passDay)System.out.println("BAMBA");//I DONT CARE ABOUT STATUS VALUE
        else
        {  
            //HERE STATUS ALWAYS WILL HOLD A VALUE SIMPLYBECAUSE RIGHT SIDE
            //IS ALREADY EVALUATED BECAUSE passDay=false and !passDay=true
            System.out.println(status);            
            //I MEAN I USE STATUS ONLY AFTER BEING INITIALIZED  
            //WHY variable status might not have been initialized IS SHOW IF I AM HERE IS BECAUSE STATUS HAS A VALUE.
        }
    }                
}
private boolean compute(){return true;}
private int loadStatusValue(){return Constants.BOTH_YORK_CORK_SET;}    

我认为在这个方法中一切正常我在使用status int变量时已经设置了甚至没有在初始化中定义。

正如你所看到的,passDay是一个布尔意味着只能保持true或false我尝试使用true和false进行硬编码而不显示编译错误时显示编译错误而不是硬编码我会做类似的事情。

final boolean passDay = compute();

实际上compute也返回一个boolean可能是true或false但是在这种情况下编译错误显示变量status可能没有被初始化但是java不能意识到即使是真正的状态只是没有使用,当为false时,状态变量被初始化或设置并在以后使用或我错了?

3 个答案:

答案 0 :(得分:4)

请阅读Java中的短路评估 - (condition1&& condition2)。

&& amp;之前的条件运算符,如果求值为false;执行不会评估其他条件,因为它不是必需的。无论条件2的输出如何 - 假和&& condition2将评估为false。尝试重新排列条件的顺序或首先初始化变量。

希望这会有所帮助。

答案 1 :(得分:3)

&&是一个短路运营商。这意味着在以下表达式中:

!passDay && ((status=loadStatusValue()))== Constants.YORK_CORK_EMPTY_SET

只有当((status=loadStatusValue()))== Constants.YORK_CORK_EMPTY_SET!passDay时,才会评估右侧操作数(true)。这意味着status的分配只会在passDay为假的情况下进行。

如果使用final boolean passDay = compute();,则在编译时无法知道compute()是返回true还是false。

我怀疑(没有尝试过)如果您使用非短路AND运算符compute(),您的代码将使用&进行编译,这将评估右侧操作数,即使左手操作数是假的。

我认为更好的方法就是重构代码,使这个条件更具可读性。具有副作用的条件是容易出错的,因为在阅读代码时很容易忽略副作用:

if (passDay) {
  System.out.println("BAMBA");
} else {
  status = loadStatusValue();
  if (status == Constants.YORK_CORK_EMPTY_SET) {
    System.out.println("inside 1");
  } else {
    System.out.println(status);
  }
}

答案 2 :(得分:1)

在您的代码中,您将passDay设置为final,这意味着它的值可以在整个程序执行期间从不更改。无论何时进行条件检查,请注意这一点,例如if(!passDay ... )等。

如果您希望或打算更改值passDay,那么您可以在执行开始时初始化为true,但不要将其视为final

希望这可以解决一些问题。