Java 我可以在实例初始值设定项中放置一个空的return语句吗?
我试图在实例初始值设定项块中放置一个空的return语句,以在字符串为null但编译器说“无法从初始值设定项中返回”的情况下退出,我在堆栈溢出中找到了这个答案,但它是关于“静态初始值设定项”,可能我的情况不同,这是代码:Java 我可以在实例初始值设定项中放置一个空的return语句吗?,java,initializer,Java,Initializer,我试图在实例初始值设定项块中放置一个空的return语句,以在字符串为null但编译器说“无法从初始值设定项中返回”的情况下退出,我在堆栈溢出中找到了这个答案,但它是关于“静态初始值设定项”,可能我的情况不同,这是代码: lsDestinatari.parallelStream().forEach(o->{ pushManagerDB.insert("log_notifiche",new HashMap<String, Object>(){{ Strin
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[...]
}});
});
lsDestinatari.parallelStream().forEach(o->{
insert(“log_notifiche”,new HashMap()){{
字符串logContent=pushToPlayers(GetPlayerFromUser(o,pushManagerDB),内容,数据,页面);
if(logContent==null)
返回;
put(“内容”,logContent);
//待办事项[…]
}});
});
您不能在初始值设定项中放入返回值
:如中所述:
如果返回语句(§14.17)出现在实例初始值设定项中的任何位置,则为编译时错误
在这种情况下,您不需要:仅在非空的情况下放置:
if (logContent != null) {
put("content", logContent);
}
但请注意,根本不需要使用初始值设定项。我知道有些人认为双括号初始化是一个聪明的把戏;但老实说,这比它的价值更麻烦。创建不必要的子类,可能包含导致内存泄漏的引用,中断序列化等,所有这些都是为了“保存”几行代码 只需在insert调用之外构建映射:
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);
不,你不能,就像编译器告诉你的那样。简单的解决方法是,不要使用返回。@pvg我正在寻找另一种解决方法。@MikeD3ViDTyson除了不使用
返回
,或不使用初始值设定项之外,没有其他解决方法。这是规格上的错误。那么,你为什么要寻找一个不同的解决方案,你认为不同的解决方案会是什么样子?@MikeD3ViDTyson这很好,但这并不是一个真正可以回答的具体问题,就像“我还没有找到我要找的”一样。“我们应该告诉你什么,去看那些没有名字的街道?”MikeD3ViDTyson,那是因为那张海报在问一个特定的问题。你是说你不喜欢JLS,这不是一个真正的问题。规范上说“你不能使用return”,你说“但是我想要”。@MikeD3ViDTyson不。如果你需要使用return
,你可能试图在初始值设定项中做得太多了。建议你,@Mike,当编译器说你不能做某事时,不要那么快相信它;只有99.9999999…99%的时间(;->)是正确的。@AndyTurner好的,三元op非常可爱。我会选择的,这是一个荣誉与谷歌工程师(我是认真的)谢谢@凯文·安德森(KevinAnderson)——(KevinAnderson)
pushManagerDB.insert(
"log_notifiche",
logContent != null
? Collections.singletonMap("content", logContent)
: Collections.emptyMap());