java中的最终初始化可以推迟,这如何防止无意中返回null?

java中的最终初始化可以推迟,这如何防止无意中返回null?,java,Java,在“java的隐藏特性”问题中,有人提到最终初始化可以推迟,并提供了一个示例: public Object getElementAt(int index) { final Object element; if (index == 0) { element = "Result 1"; } else if (index == 1) { element = "Result 22"; } else { element

在“java的隐藏特性”问题中,有人提到最终初始化可以推迟,并提供了一个示例:

public Object getElementAt(int index) {
    final Object element;
    if (index == 0) {
         element = "Result 1";
    } else if (index == 1) {
         element = "Result 22";
    } else {
         element = "Result 3";
    }
    return element;
}
海报上写着:

很容易漏掉一个案例而意外返回null。这并不是说返回null是不可能的,只是很明显这是故意的


然而,我无法理解这意味着什么。如果元素未声明为final,这有什么不同?else语句不总是确保不返回null吗?我认为这更像是一件装饰性的事情,而不是实际影响代码的运行方式。

你发布问题的方式,海报似乎在说如果你这样做了:

 Object element = null;
然后通过if方法进行设置,您可能会意外地返回null(如果您没有正确构造else语句),因此可以利用最终初始化可能不同于after声明这一事实

然而,这个例子是多余的,因为编译器保证在使用这个变量之前设置它,因为它是本地的

更有趣的是这样一个案例:

public class SomeClass {
     private final Object element;

     public SomeClass(int index) {
            if (index == 0) {
                element = "Result 1";
            } else if (index == 1) {
                element = "Result 22";
            } else {
                element = "Result 3";
            }
     }
}
在这种情况下,如果您从未设置元素,编译器将向您发出警告,而不是为您将其设置为null,如果未声明为final,则会发生这种情况


总之,有趣的是,不必在声明字段或变量的位置设置最终字段或变量(正如您可能倾向于认为的那样)。Final表示只能将其设置为给定值一次,而不是必须将其设置在声明的同一行。

您发布问题的方式,海报似乎在说,如果您这样做:

 Object element = null;
然后通过if方法进行设置,您可能会意外地返回null(如果您没有正确构造else语句),因此可以利用最终初始化可能不同于after声明这一事实

然而,这个例子是多余的,因为编译器保证在使用这个变量之前设置它,因为它是本地的

更有趣的是这样一个案例:

public class SomeClass {
     private final Object element;

     public SomeClass(int index) {
            if (index == 0) {
                element = "Result 1";
            } else if (index == 1) {
                element = "Result 22";
            } else {
                element = "Result 3";
            }
     }
}
在这种情况下,如果您从未设置元素,编译器将向您发出警告,而不是为您将其设置为null,如果未声明为final,则会发生这种情况


总之,有趣的是,不必在声明字段或变量的位置设置最终字段或变量(正如您可能倾向于认为的那样)。Final表示只能将其设置为给定值一次,而不是必须将其设置在声明的同一行。

Final只能设置,不能重新设置。它们有时与java中的常量概念混为一谈。更准确地说,它们是不可变的对象引用


问题是,如果某个东西是不可变的,那么如何以及何时设置它的初始值。答案是java检查只有一个可能的流可以为最终变量赋值。这样,您就不必在声明时分配值。

期末考试只能设置,不能重新设置。它们有时与java中的常量概念混为一谈。更准确地说,它们是不可变的对象引用


问题是,如果某个东西是不可变的,那么如何以及何时设置它的初始值。答案是java检查只有一个可能的流可以为最终变量赋值。这样,您就不必在声明时分配值。

使用第二个示例,编译器返回:“无法将值分配给最终变量元素”。我的IDE建议我将field元素设置为非final。关键是,最后一个字段是在类的构造函数中设置的,而不是在方法中设置的。初始值设定项也可以。好的,这很有意义。我想我的问题不是很清楚,我道歉。OP提到这有助于防止空值。然而,你澄清了这一点,从我可以看出,他们的示例根本不是他们所描述的示例。使用第二个示例,编译器返回:“无法为最终变量元素赋值”。我的IDE建议我将field元素设置为非final。关键是,最后一个字段是在类的构造函数中设置的,而不是在方法中设置的。初始值设定项也可以。好的,这很有意义。我想我的问题不是很清楚,我道歉。OP提到这有助于防止空值。不管你怎么解释,从我可以看出他们的例子根本不是他们所描述的例子。我觉得这需要一些解释。最后一个变量是对对象的不可变引用,对象本身绝对不是不可变的!只有当对象的所有字段都是不可变的(对于复杂字段,它们也必须是不可变的)时,对象才是不可变的。不幸的是,Java没有不可变对象的概念:(@Gerco Dries:变量不必是引用我觉得这需要澄清。最后一个变量是对对象的不可变引用,对象本身肯定不是不可变的!只有当对象的所有字段都不可变时,对象才是不可变的不幸的是,Java没有不可变对象的概念:(@Gerco-Dries:variable不必是引用