Как сделать ссылку на эту переменную `final`, как мне сделать так, чтобы она компилировалась чисто? - PullRequest
1 голос
/ 06 мая 2011

Я хочу сделать 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 ]

3 голосов
/ 06 мая 2011

Намного проще не устанавливать переменную.

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;
}
2 голосов
/ 06 мая 2011

Попытка использовать 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?

1 голос
/ 06 мая 2011

Нельзя переназначить значение переменной final, поэтому это невозможно.

edit: Противоречие в желании объявить локальную для метода переменную как finalизменить значение тем же методом - зачем вообще объявлять его как final в этом методе?

0 голосов
/ 06 мая 2011

Если вы объявите локальную переменную как final в методе, то значение этой переменной не может быть изменено в методе.

Удалите final из объявления result или получитеизбавиться от локальной переменной result и вернуть непосредственно из блоков catch и конца метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...