【发布时间】:2018-09-26 18:24:09
【问题描述】:
我有以下类,用于在我的 Android 应用程序的各个位置控制一些调试和 beta 测试选项。它只包含一些标志和一些逻辑来(反)序列化它到/从 JSON。
public class DevConfiguration {
public boolean dontSendSMS;
public static String toJsonString(DevConfiguration devConfiguration) {
JSONObject json = new JSONObject();
if( devConfiguration != null ) {
try {
json.put("dontSendSMS", devConfiguration.dontSendSMS);
} catch (JSONException e) {
e.printStackTrace();
}
}
return json.toString();
}
public static DevConfiguration fromJsonString(String jsonString) {
if( jsonString.isEmpty() )
return null;
DevConfiguration result = new DevConfiguration();
try {
JSONObject jsonObj = new JSONObject(jsonString);
result.dontSendSMS = jsonObj.optBoolean("dontSendSMS", false);
} catch (JSONException e) {
e.printStackTrace();
}
return result;
}
}
现在,在我的一个服务中,我在Intent 中接收到一个序列化的DevConfiguration 对象,然后可能会将其传递给另一个服务:
serviceIntent.putExtra("dev_conf", DevConfiguration.toJsonString(mDevConfiguration));
我选择将toJsonString() 方法设为静态,这样我就不会冒险在null 实例上调用它。但是,仍然有可能在某处出错并在实例上调用静态方法 - 可能是 null 实例!
mDevConfiguration.toJsonString(mDevConfiguration);
Android Studio 中有一个 Lint 警告,但它仍然是一个潜在的 NullPointerException 错误等待发生。我认为可以通过定义类似的 private 方法来隐藏它,但签名不同
/** Hide instance implementation **/
private String toJsonString(Object o){ return ""; }
当然,使用 DevConfiguration 参数调用它无论如何都会调用静态方法,并且 IDE 也不会给出比以前更多的警告。
有没有办法从实例变量中“隐藏”静态方法?
编辑
评论清楚地表明,在null 实例上调用静态方法是完全合法的。然而,问题不在于“如何在空实例上调用静态方法时防止 NullPointerException?”,而是更一般的 “如何防止在空实例上调用静态方法?我的班级的实例?”。
换句话说 - 如果一个人不小心尝试在实例上调用静态方法,有什么方法可以防止编译器编译?
【问题讨论】:
-
内部类应该可以帮到你。
-
你真的尝试过测试你的假设吗?我没有得到 NPE:ideone.com/u2UPPd
-
@JohannesKuhn Doh!你是对的,它不会抛出 NPE,这应该是公认的答案。在我的辩护中,我发现链接的问题措辞很奇怪,这可能就是为什么在搜索或输入我的问题标题时它没有出现的原因。进行快速谷歌搜索时也没有找到任何东西。
-
我搜索了
static method on null,这是第一个结果。 -
@JohannesKuhn 我搜索了
prevent static method on instance,因为我对这种一般情况而不是空实例的边缘情况感兴趣。这个问题是适用于 Java 的第一个相关问题。
标签: java android nullpointerexception static static-methods