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

时间:2011-05-06 15:54:31

标签: java final idioms

我想制作result变量final,如何构建此代码以便干净地编译?我知道我过去已经这样做了,但我不记得我是如何构建它以使其工作的。

以下代码是一个straw man示例,我正在尝试清理的代码要复杂得多,这只是提炼我想要完成的内容。

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 =

那么你在哪里设置result = true;以便干净地编译它?

4 个答案:

答案 0 :(得分:3)

不设置变量要简单得多。

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;
}

答案 1 :(得分:2)

尝试使用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限定符?

答案 2 :(得分:1)

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

编辑:想要将方法本地的变量声明为final并且也在同一方法中更改值也是一个矛盾 - 为什么有必要将其声明为final在这种方法中呢?

答案 3 :(得分:0)

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

final的声明中删除result,或者完全删除result局部变量并直接从catch块内返回并返回方法