我可以在实例初始化程序中放置一个空的return语句吗?

时间:2017-09-12 11:15:44

标签: java initializer

我正在尝试在实例初始化程序块中放置一个空的return语句,以便在字符串为null但是编译器说"无法从初始化程序中返回时退出#34; ,我已经在堆栈溢出中找到了这个答案this answer,但是关于" 静态初始化程序"也许我的情况不同,这是代码:

lsDestinatari.parallelStream().forEach(o->{
    pushManagerDB.insert("log_notifiche",new HashMap<String, Object>(){{
        String logContent = pushToPlayers(getPlayersFromUser(o,pushManagerDB),content,data,page);
        if(logContent==null)
            return;     
        put("content", logContent);
        //TODO[...]     
    }});
});         

1 个答案:

答案 0 :(得分:1)

您无法在初始值设定项中添加return:正如JLS Sec 8.6中所述:

  

如果返回语句(第14.17节)出现在实例初始值设定项中的任何位置,则为编译时错误。

在这种情况下,您不需要:只在非空案例中put

if (logContent != null) {
  put("content", logContent);
}

但请注意,根本不需要使用初始化程序。我知道有些人认为双支撑初始化是一个聪明的伎俩;但老实说,它比它的价值更麻烦。您创建了不必要的子类,可能包含导致内存泄漏,中断序列化等的引用。所有这些都是为了“保存”几行代码。

只需在插入调用之外构建地图:

String logContent = pushToPlayers(getPlayersFromUser(o,pushManagerDB),content,data,page);
HashMap<String, Object> map = new HashMap<>();
if (logContent != null) {
  map.put("content", logContent);
}
pushManagerDB.insert("log_notifiche", map);

pushManagerDB.insert(
    "log_notifiche",
    logContent != null
        ? Collections.singletonMap("content", logContent)
        : Collections.emptyMap());