【问题标题】:Can i put a empty return statement inside an instance initializer?我可以在实例初始化程序中放置一个空的返回语句吗?
【发布时间】:2018-02-20 20:00:31
【问题描述】:

我正在尝试在实例初始化程序块中放置一个空的返回语句以退出,以防字符串为空但编译器说“无法从初始化程序中返回”,我在堆栈上找到了这个答案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。
  • @pvg 我正在寻找不同的解决方法..
  • @MikeD3ViDTyson 除了不使用 return 或不使用初始化程序之外,没有其他解决方法。这是规范的错误。那么,为什么您要寻找不同的解决方法,您认为不同的解决方法会是什么样子?
  • @MikeD3ViDTyson 这很好,但它不是一个真正可以回答的具体问题,就像“我还没有找到我要找的东西”一样。我们应该告诉你什么,看看哪里的街道没有名字?
  • @MikeD3ViDTyson 那是因为那个发帖人在问一个特定的问题。你说你不喜欢 JLS,这不是一个真正的问题。规范说“你不能使用 return”,而你说“但我想要”。

标签: java initializer


【解决方案1】:

您不能将return 放入初始化程序中:正如JLS Sec 8.6 中所说:

如果 return 语句(第 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());

【讨论】:

  • @MikeD3ViDTyson 没有。如果你需要使用return,你可能试图在初始化器中做太多事情。
  • 忠告,@Mike,当编译器说你不能做某事时,不要这么快就相信它;只有大约 99.999999...99% 的时间是正确的 (;->)。
  • @AndyTurner 好的,三元运算很可爱。我会选择那个,很荣幸与谷歌工程师交谈(我是认真的)谢谢!
  • @KevinAnderson ٩(- ̮̮̃-̃)۶
猜你喜欢
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
相关资源
最近更新 更多