我正在尝试合并
更新后的代码不起作用,关于“操作方法”的答案必须非常简单,但我需要帮助:
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。我不想使用(私有int +公共getter +私有setter)
答案 0 :(得分:3)
当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);
}
答案 1 :(得分:1)
当您在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;
}
}