空白最终变量

Blank final variables

我正在尝试合并

  1. public 访问变量
  2. 非静态变量
  3. 不是预定值
  4. 一次设定值(最终)
  5. 整数或整数

更新后的代码 无法正常工作 'how to do it' 上的答案一定很简单,但我需要帮助:

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)

myObj 为 null 时,不会设置最终字段。这会导致编译错误,它们必须在 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);
}

当您在 try 块中执行赋值时,编译器将其视为 try … catch … 构造之后“可能发生或可能未发生”,这使得它不符合 final 你想在该构造之后使用的变量。

解决方案是使用临时非最终变量,您可以多次赋值,并在操作结束时对 final 变量执行确定赋值。

例如

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