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

Can i put a empty return statement inside an instance initializer?

我正在尝试在实例初始化程序块中放置一个空的 return 语句以在字符串为空但编译器说 "Cannot return from within an initializer" 的情况下退出,我找到了这个答案 this answer 在堆栈溢出上,但它是关于“static initializer”,也许我的情况不同,这是代码:

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[...]     
    }});
});         

你不能在初始值设定项中放入 return:如 JLS Sec 8.6:

中所述

It is a compile-time error if a return statement (§14.17) appears anywhere within an instance initializer.

在这种情况下,您不需要:仅在非空情况下 put

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

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

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

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());