Java 如何使这个变量引用'final',如何使它干净地编译?

Java 如何使这个变量引用'final',如何使它干净地编译?,java,final,idioms,Java,Final,Idioms,我想使结果变量最终,如何构造此代码以使其编译干净?我知道我在过去做过,但我不记得我是如何构建它的 下面的代码是一个稻草人示例,我试图清理的代码要复杂得多,这只是提取我试图完成的工作的本质 private boolean someMethod() { final boolean result; try { // do the logic here that might throw the following // exceptions

我想使
结果
变量最终,如何构造此代码以使其编译干净?我知道我在过去做过,但我不记得我是如何构建它的

下面的代码是一个稻草人示例,我试图清理的代码要复杂得多,这只是提取我试图完成的工作的本质

private boolean someMethod()
{
    final boolean result;
    try
    {
        // do the logic here that might throw the following
        // exceptions
    }
    catch (final IOException ioe)
    {
        result = false;
    }
    catch (final ClassNotFoundException cnfe)
    {
        result = false;
    }

    return result;
}
我不能将
result=true
放在
try
块中,因为它不会在两个catch块都抱怨可能已经分配了最终变量的情况下编译

我不能把它放在
finally
块中,因为那样会产生与
try
块相同的投诉

我希望能够设置
结果=
一次且仅一次。


那么在哪里设置
result=true以使其干净地编译?

您不能将值重新分配给
最终的
变量,因此这是不可能的


编辑:想要将方法的局部变量声明为
final
,同时更改同一方法中的值,这也是一个矛盾-为什么在该方法中必须将其声明为
final

您无法将值重新分配给
final
变量,因此这是不可能的


编辑:想要将一个方法的局部变量声明为
final
,同时更改同一方法中的值,这也是一个矛盾-为什么在这个方法中必须将其声明为
final

试图使用
final
强制执行“精确分配一次”总是很棘手的。您可以使用第二个变量:

private boolean someMethod()
{
    boolean res;
    try
    {
        // do the logic here that might throw the following
        // exceptions
    }
    catch (final IOException ioe)
    {
        res = false;
    }
    catch (final ClassNotFoundException cnfe)
    {
        res = false;
    }
    final boolean result = res;
    return result;
}

但真正的问题是,为什么不删除
final
限定符?

试图使用
final
强制执行“只分配一次”总是很棘手的。您可以使用第二个变量:

private boolean someMethod()
{
    boolean res;
    try
    {
        // do the logic here that might throw the following
        // exceptions
    }
    catch (final IOException ioe)
    {
        res = false;
    }
    catch (final ClassNotFoundException cnfe)
    {
        res = false;
    }
    final boolean result = res;
    return result;
}

但真正的问题是,为什么不删除
final
限定符?

如果在方法中声明局部变量为
final
,则该变量的值在方法中无法更改


结果的声明中删除
最终
,或者完全去掉
结果
局部变量,并直接从
catch
块和方法末尾返回。

如果在方法中将局部变量声明为
final
,则该变量的值在方法中无法更改


result
的声明中删除
final
,或者完全去掉
result
局部变量,直接从
catch
块和方法末尾返回。

不设置变量要简单得多

private boolean someMethod() {
    try {
        // do the logic here that might throw the following
        return true;

    } catch (IOException ioe) {
        // handle IOE
    } catch (ClassNotFoundException cnfe) {
        // handle CNFE
    }
    return false;
}

不设置变量要简单得多

private boolean someMethod() {
    try {
        // do the logic here that might throw the following
        return true;

    } catch (IOException ioe) {
        // handle IOE
    } catch (ClassNotFoundException cnfe) {
        // handle CNFE
    }
    return false;
}

为什么要使局部变量
final
?我尽可能地使一切
final
,因为它使调试更加容易,记录了变量应该被赋值一次且只能赋值一次的意图,并且在大多数情况下也是编译器的优化提示。我不想在这方面争论,我知道尽可能多的变量引用
final
极大地提高了代码库的质量。@Jarrod Roberson:对我来说,在这种情况下,这种“优化”会降低代码质量(即可读性)。没有理由将
结果
声明为
最终
,尤其是当它会使您的方法变得不必要的复杂时。除此之外,我完全同意你的意见。:)这是一个稻草人的问题,这实际上不是我想要的代码,它不会使它更复杂,它使它更可读,如果我的代码中需要设置此值的其他位置尝试重写它,编译器将捕获错误。如果我的代码中需要设置此值的其他位置尝试重写它,编译器将捕获错误?这是一个局部变量!为什么要使局部变量
final
?我尽可能地使一切
final
,因为它使调试更加容易,记录了变量应该被赋值一次且只能赋值一次的意图,并且在大多数情况下也是编译器的优化提示。我不想在这方面争论,我知道尽可能多的变量引用
final
极大地提高了代码库的质量。@Jarrod Roberson:对我来说,在这种情况下,这种“优化”会降低代码质量(即可读性)。没有理由将
结果
声明为
最终
,尤其是当它会使您的方法变得不必要的复杂时。除此之外,我完全同意你的意见。:)这是一个稻草人的问题,这实际上不是我想要的代码,它不会使它更复杂,它使它更可读,如果我的代码中需要设置此值的其他位置尝试重写它,编译器将捕获错误。如果我的代码中需要设置此值的其他位置尝试重写它,编译器将捕获错误?这是一个局部变量!或者删除
try-catch
块并使
someMethod
抛出
IOException
ClassNotFoundException
。根据文档,这应该只设置一次,而且只能设置一次,这使得出错和帮助调试变得非常困难。这个答案没有达到我的目标。我不想用与代码无关的异常来污染代码的其余部分operation@Jarrod-我认为编译器执行的流分析不会让您在catch块中执行这种赋值。有人可能会说,它应该能够做到这一点,但它就是做不到。我建议不要在这个问题上与市政厅抗争,只需更换
最终的
声明即可