如何从finally块访问方法的结果值

尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时,在极少数情况下,它也会非常有用。

一个例子

方法结果值放在堆栈中。 如果查看以下示例:

public int method() {if (something)return 1;...if (somethingElse)return 2;...return 0;
}

如果我们忽略了停机问题 ,错误处理,以及其他学术讨论,我们可以说,上述方法将“肯定”返回的任何值120 。 并且该值在退出该方法之前被放入堆栈中。

现在,有时,仅当返回给定结果值时才采取一些措施可能是一个用例。 然后,可能会诱使人们开始关于是否有多个return语句为EVIL™的古老争论 ,而整个方法应该这样写:

public int method() {int result = 0;if (something)result = 1;...if (somethingElse)result = 2;...// Important action here prior to returnif (result == 1337)log.info("hehehe ;-)");return result;
}

当然,上面的示例是错误的,因为以前, if (something) return 1if (something) return 2语句则立即中止方法执行。 为了使用“单返回语句”技术实现相同的目的,我们必须像这样重写代码:

public int method() {int result = 0;if (something)result = 1;else {...if (somethingElse)result = 2;else {...}}// Important action here prior to returnif (result == 1337)log.info("hehehe ;-)");return result;
}

…并且,当然,我们可以继续使用花括号和/或压痕水平线进行骑车脱下和发火警告 ,这表明我们没有获得任何好处。

从堆栈访问返回值

我们在原始实现中真正想做的是在返回之前检查一下堆栈上的值,即将返回什么值。 这是一些伪Java:

public int method() {try {if (something)return 1;...if (somethingElse)return 2;...return 0;}// Important action here prior to returnfinally {if (reflectionMagic.methodResult == 1337)log.info("hehehe ;-)");}
}

好消息是:是的,我们可以! 这是实现上述目标的简单技巧:

public int method() {int result = 0;try {if (something)return result = 1;...if (somethingElse)return result = 2;...return result = 0;}// Important action here prior to returnfinally {if (result == 1337)log.info("hehehe ;-)");}
}

不太好的消息是:您一定不要忘记显式分配结果。 但是每隔一段时间,当Java语言实际上不允许您访问时,此技术对于“访问方法堆栈”非常有用。

当然…

当然,您也可以在这里诉诸无聊的解决方案:

public int method() {int result = actualMethod();if (result == 1337)log.info("hehehe ;-)");return result;
}public int actualMethod() {if (something)return result = 1;...if (somethingElse)return result = 2;...return result = 0;
}

…而且,也许在大多数情况下,这种技术确实更好(因为更具可读性)。 但是有时候,您想要做的事情不仅限于登录该finally块,或者您想要访问的不仅仅是结果值,而且您不想重构该方法。

其他方法?

现在轮到你了。 您首选的替代方法是什么(带有代码示例?),例如,使用Try monad? 还是方面?

翻译自: https://www.javacodegeeks.com/2015/05/how-to-access-a-methods-result-value-from-the-finally-block.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六章 Qt布局管理器Layout

第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置。当用户改变窗口的大小,组件还静静地呆在原来的位置,这有时候显然…

kafka集群状态Linux,Kafka集群配置

本文只要讲述Kafka集群的配置事项,包括zookeeper集群的配置。本文讲述的前提是kafka和zookeeper在单机情况下已正确安装和配置。如有疑问,可以参考《Linux(CentOS)中常用软件安装,使用及异常——Zookeeper, Kafka》。假设集群中有三台机器, i…

【APICloud系列|36】小米应用商店可以检测同个应用不同版本信息

在小米应用商店上架的信息 在其他应用商店上架的信息,比如应用宝 小米发过来的友好提示邮件:

VLAN的Hybrid和Trunk端口有何区别

有网友问这样一个问题: vlan 1 vlan 2 vlan 3 vlan 4 vlan 5 interface Ethernet0/1 port link-type hybrid port hybrid vlan 1 to 4 untagged port hybrid pvid vlan 2 interface Ethernet0/2 port link-type hybrid port hybrid vlan 3 to 5 untagged port hybri…

【APICloud系列|35】小米应用商店版本更新

1.在小米应用商店后天重新上传一个更新加固已经签名的安装包。 链接地址:https://dev.mi.com 2.完善资料,只需要填写更新日志简单说明更新的缘由,再次选择相应的语言即可。原来的内容还是存在的。 3.提交审核就行。

Linux光盘检测,qpxtool

软件简介各位使用Linux系统的刻录发烧友有福了。不用再为了检测光碟品质而切换到Windows系统了。因为在Linux系统里也有支持光碟品质检测的软件!它的名字是QPxTool。虽说05年底QPxTool就诞生了,但最近才被以rpm包的形式提供给Fedora用户。首先看下它的界…

eclipse中tomcat能正常启动,在浏览器中不能打开问题

问题原因:没有在eclipse中tomcat的server location设置到tomcat的安装目录。 解决办法:1、选择server点击右键,选择Open选项,然后在server location栏设置tomcat的安装目录。 2、重新启动tomcat server。 3、在浏览器中输入&#…

存根类 测试代码 java_为旧版代码创建存根-测试技术6

存根类 测试代码 java任何阅读此博客的人都可能已经意识到,目前我正在开发一个项目,其中包含大量的旧代码,这些旧代码庞大,扩展且编写时从未进行过任何测试。 在使用此遗留代码时,有一个行为非常差的类非常普遍&#…

百度开发平台提交应用后进行官方认证审核失败?

昨晚收到一封来自百度的邮件 这里需要登录工业和信息化部查询后的ICP备案后的详细页面截图。(其实也可以在备案的平台查询相关信息,我的是在阿里云备案的,所以直接去阿里云比较方便快捷) 然后直接上传营业执照副本、ICP备案截图、…

linux字体如何删除不了,如何彻底替换Ubuntu下Chrome字体(清除楷体字)

刚刚升级到了Ubuntu 11.04,chrome也跟进到了11.0.696.57,让人纠结的依旧是Chrome内的字体,在首选项-->高级选项-->自定义字体并不能解决所有问题,还是有些网站看上去是令人纠结的楷体。在你的用户文件夹下(比如用户名为libai)选择显示所…

使用默认方法进行接口演化–第二部分:接口

引入了默认方法以启用接口演进。 如果向后兼容是不可替代的,则仅限于向接口添加新方法(这是它们在JDK中的唯一用法)。 但是,如果希望客户端更新其代码,则可以使用默认方法逐步演化接口而不会引起编译错误,从…

【APICloud系列|37】百度开放平台应用+,提升用户下载量操作步骤

进入百度应用开放平台后台,按图中步骤点击。 接入步骤 这个首先要准备和应用名称一致的百家号 链接地址: 进入官方号平台:http://gfh.baidu.com/ 填写官方的ID以及联系人的手机号即可,最后点击提交。

linux 命令 抛后台,Linux 后台执行命令

场景python 代码,打印1~3000,每秒打印一次## file_name: test.pyimport timei 0while 1:time.sleep(1)i i 1print(i)if i > 3000:break问题:直接在终端执行:python test.py, 需要在这个终端一直等,没法干别的事了…

【JSP】JSP与oracle数据库交互案例

************************************************************************ ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ 本案例为咖啡销售情况录入查询系统 一、数据输入系统&…

【APICloud系列|34】上架华为应用市场缺少免责函?

针对华为应用市场,不管提交的是什么类型的应用,都应该提交免责函, 需要提前下载模板进行盖章后,转成图片上传。 免责函模板如下: 被拒绝的信息如下: 再次将免责函提交上去就没啥问题啦,因为其…

Property Animator 属性动画概述与示例

Property Animation 属性动画 属性动画是一个强大的框架,它几乎可以让你的所有东西做动画,你可以随着时间的推移通过更改他们的属性来定义动画,无论它是否绘制在屏幕上,一个属性动画是在指定的时间内去改变属性(一个对…

注册服务号、订阅号流程

进入微信公众平台,选择注册类型,订阅号/服务号 填写基本信息 选择类型 选择订阅号或者服务号

sql并发 锁 优化思路_并发优化–减少锁粒度

sql并发 锁 优化思路在高负载多线程应用程序中,性能非常重要。 开发人员必须意识到并发问题才能获得更好的性能。 当我们需要并发时,我们通常拥有必须由两个或更多线程共享的资源。 在这种情况下,我们处于竞争状态 ,其中只有一个线…

c语言 指针到字符串,C语言中的指针和字符串

前言务必理解指针与内存模型,不要死记硬背。内存里的字符串C语言中的字符串一般是char *类型的,这是怎样存在内存中的呢?cchar *s "NIHAO";| s:400 ||---|---|---|---||N|I|H|A|O| 0 ||---|---|---|---|---|---||400|401|402|403|…

【APICloud系列|33】移动应用软件加固步骤,适合所有的安卓应用市场

在腾讯开放平台下载应用加固工具legutools 下载安装打开 点击获取API密钥。链接: https://cloud.tencent.com/developer/article/1385239 一、登录腾讯云账号