尽管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

如何从finally块访问方法的结果值相关推荐

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

    finally块 尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法. 即使有时在极少数情况下,它也将非常有用. 一个例子 方法结果值放在堆栈中. 如果查看以下示例 ...

  2. 定义一个名为Rectangle的类表示矩形,其中含有length和width两个double型的成员变量表示长和宽。要求为每一个变量定义访问方法和修改方法......

    标题定义一个名为Rectangle的类表示矩形,其中含有length和width两个double型的成员变量表示长和宽.要求为每一个变量定义访问方法和修改方法,定义求矩形周长的方法getPerimet ...

  3. 大学计算机地址块域,基于视觉显着性的信封地址块定位方法-计算机工程.pdf

    基于视觉显着性的信封地址块定位方法-计算机工程 第 卷 第 期 计 算 机 工 程 年 月 图形图像处理 文章编号 文献标识码 中图分类号 基于视觉显著性的信封地址块定位方法 程美玲张汉超续晋华 华东 ...

  4. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法

    ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法 一.前言 在非静态页面的项目开发中,必定会涉及到对于数据库的访问,最开始呢,我们使用 Ado.Net,通过编写 SQL 帮助类 ...

  5. [转载] JAVA面向对象之代码块 继承 方法的重写 super关键字与重写toString()方法介绍

    参考链接: 可以重写Java中的私有方法吗 JAVA面向对象之代码块与继承 代码块分类 局部代码块 作用:限制变量生命周期 书写位置:在方法中 构造代码块 开发中很少使用 书写位置:类中  方法外 调 ...

  6. 操作系统中的文件系统和访问方法

    文件 (File) A file is basically a sequence of bytes organized into blocks that are understandable by a ...

  7. 索引扫描时,对同一个叶子块访问多次的原因初探

    点击上方"蓝字" 关注我们,享更多干货! 在观察索引扫描会按何种次序进行索引块的访问时,我发现了一种现象,即会有部分叶子块被访问两次或更多.以下是我自己对这种现象的重现,以及对产生 ...

  8. day6 面向对象 类的定义访问 命名空间的声明 对象的定义创建 字段的定义创建访问 方法的创建调用

    day6 面向对象 面向过程是分析解决问题的步骤,然后把步骤实现 面向对象是把构成问题的事分解成各个对象,不是为了完成步骤,为了描述在整个 类是类别 是一种抽象的数据类型 是相同特征实体的抽象 类里共 ...

  9. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

最新文章

  1. OSC源创会往期图文回顾链接地址收藏
  2. 不常见但很有用的chrome调试工具使用方法
  3. 中国计算机学会CCF推荐国际学术会议和期刊目录-交叉/综合/新兴
  4. rust为什么显示不了国服_捋捋 Rust 中的 impl Trait 和 dyn Trait
  5. 【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)
  6. kali安装docker和portainer
  7. 第一个云原生步骤:自动化构建、测试和部署(二)
  8. How to add svn:externals in windows using TortoiseSVN
  9. Linux中KVM虚拟机是什么
  10. indexOf 和 lastIndexOf 使用
  11. OCR应用场景:票总管发票管理系统
  12. 服务器性能监控之New Relic 入门教程
  13. 互联网单点登录集成方案
  14. 线段树——区间合并(模板题)
  15. 雷鸣的游戏人生(六) --- 如何开始学习编程?
  16. kafka javax.management.InstanceAlreadyExistsException: kafka.consumer:type=app-info,id=consumer-1
  17. 【web前端开发】什么是前端?
  18. android 7.0 动态壁纸,LOL动态壁纸手机版app下载
  19. Android中Apk加固之Dex文件的加密与解密
  20. “夜经济”迭新,伍曦设计探索创新场景体验

热门文章

  1. Struts文件上传与下载详解_文件的下载
  2. SpringCloudConfig整合Nacos
  3. 尚硅谷2020最新版SpringCloud(H版alibaba)框架开发教程全套完整版从入门到精通
  4. android 按键消息,在android中模拟键盘消息(shell命令的方法)
  5. python scratch unity_Unity3D研究院之2D游戏开发制作原理(二十一)
  6. 转: 记录centos7 安装erlang22.3和rabbitMQ
  7. tomcat(19)Manager应用程序的servlet类
  8. tms tck_在雅加达EE TCK中使用Arquillian的可能方法
  9. 春天猫rtsy_春天:注入列表,地图,可选对象和getBeansOfType()陷阱
  10. tomee_Apache TomEE + JMS。 从未如此简单。