Пустые конечные переменные - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь объединить

  1. открытый доступ к переменной
  2. нестатическая переменная
  3. не предопределенное значение
  4. одноразовое заданное значение (окончательное)
  5. int или Integer

Обновленный код не работает, и ответ на вопрос «как это сделать» должен быть довольно простым, но мне нужна помощь:

public class foo
{
    public final int smth; //Variable might not have been initialized
    public final Integer smthElse; //Variable might not have been initialized

    public foo(JSONObject myObj)
    {
        if(myObj != null) {
            try {
                int extraParam = Integer.parseInt("ABCD"); //This is just an example for Exception to be called
                smth = extraParam;
                smthElse = extraParam;
            } catch (Exception e) {}
        } else {
            smth = 1;
            smthElse = 2;
        }
    }
}

P.S. Я не хочу использовать (private int + public getter + private setter)

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Когда вы выполняете присваивание в блоке try, компилятор обрабатывает его как «могло или не могло произойти» после конструкции try … catch …, что делает его неподходящим для переменных final, которые вы хотите использовать после этого построить.

Решение состоит в том, чтобы использовать временные неконечные переменные, которые вы можете назначать несколько раз и выполнять определенное назначение final переменных в конце операции.

1009 * Е.Г. *

public class Foo
{
    public final int smth;
    public final Integer smthElse;

    public Foo(JSONObject myObj) {
        int smthValue = 1;
        Integer smthElseValue = 2;

        if(myObj != null) try {
            int extraParam = Integer.parseInt("ABCD"); //This is just an example
            smthValue = extraParam;
            smthElseValue = extraParam;
        } catch (Exception e) {}

        smth = smthValue;
        smthElse = smthElseValue;
    }
}
0 голосов
/ 09 ноября 2018

Когда myObj равно нулю, окончательные поля не будут установлены. Это приводит к ошибке компиляции, они должны быть установлены после завершения конструктора foo(Object myObj, int extraParam).

Если вам нужно создать экземпляр foo, можно добавить блок else.

public foo(Object myObj, int extraParam) {
  if (myObj != null) {
    smth = extraParam;
    smthElse = extraParam;
  } else {
    smth = 0;
    smthElse = 0;
  }
}

или создайте фабричный метод для выполнения проверки.

private foo(int extraParam) {
  smth = extraParam;
  smthElse = extraParam;
}

public static foo from(Object myObj, int extraParam) {
  return (myObj == null) ? new foo(0) : new foo(extraParam);
}
...