java - BigDecimal 符号 eclipse 插件或不错的外部工具

标签 java eclipse plugins bigdecimal

我需要使用 BigDecimal 进行很多操作,而且我发现必须要表达

Double a = b - c * d; //natural way

作为

BigDecimal a = b.subtract(c.multiply(d))//BigDecimal way

不仅丑陋,而且是我和业务分析师之间错误和沟通问题的根源。他们完全能够使用 Doubles 阅读代码,但现在他们不能。

当然,一个完美的解决方案是 java 对运算符重载的支持,但由于这不会发生,我正在寻找一个 eclipse 插件,甚至是一个外部工具,可以自动从“自然方式”转换为“bigdecimal”方式”。

不是尝试预处理源代码或动态翻译或任何复杂的东西,我只是想要一些我可以输入文本和获取文本的东西,并保持“自然方式”作为注释源代码。

P.S.:我找到了 this incredible smart hack但我不想开始进行字节码操作。也许我可以用它来创建一个 Natural2BigDecimal 转换器,但如果有人已经做过这样的工具,我不想重新发明轮子。

我不想切换到 Scala/Groovy/JavaScript,我也不能,公司规则禁止在服务器端代码中使用 java 以外的任何东西。

最佳答案

“我不是要预处理源代码......我只是想要一些我可以输入 [bigDecimal 算术表达式] 文本的东西”。

解决问题的一半是认清问题的本质。您确实想要一些东西来预处理您的 BigDecimal 表达式以生成合法的 Java。

您只有两个基本选择:

  • 一种独立的“领域特定语言”和 DSL 编译器,它接受“标准”表达式并将它们直接转换为 Java 代码。 (这是一种预处理器)。这给您留下了保留所有表达式片段并以某种方式知道将它们放在 Java 代码中的位置的问题。

  • 读取 Java 源文本、查找此类表达式并将其转换为文本中的 BigDecimal 的工具。我会建议一些让您在实际代码之外编写表达式并插入翻译的东西。

也许(从另一个答案中窃取):

 // BigDecimal a = b - c * d;
 BigDecimal a = b.subtract( c.multiply( d ) );

意思是“将注释中的大十进制表达式编译成它的 java 等效项,并用该翻译替换以下语句。

要实现第二个想法,你需要一个program transformation system ,它可以应用源到源重写规则来转换(作为转换的特例生成)代码。这只是一个预处理器,可以根据您的需要进行定制。

我们的 DMS Software Reengineering Toolkit与其 Java Front End 可以做到这一点。您需要一个完整的 Java 解析器来完成该转换部分;您将需要名称和类型解析,以便您可以解析/检查建议的表达式是否正常。

虽然我同意原样的 Java 表示法很丑陋,而且您的提议会使它更漂亮,但我个人认为这不值得付出努力。您最终依赖于一个复杂的工具(是的,DMS 很复杂:操纵代码并不容易)以获得相当边际的 yield 。

如果您和您的团队编写了数千个这样的公式,或者这些公式的编写者对 Java 不熟悉,那么这可能是有道理的。在这种情况下, 我会走得更远,只是坚持您在需要的地方编写标准 表达式格式。您可以自定义 Java 前端以检测操作数类型何时为十进制类型,并为您重写。然后,您只需在每个 Java 编译步骤之前运行这个预处理器。

关于java - BigDecimal 符号 eclipse 插件或不错的外部工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636228/

相关文章:

java - 多行 gnu 正则表达式

java - netty 4客户端ssl配置请求所有https站点

java - 停止 Eclipse/Gradle 生成 .project 和 .settings/

scala - 使用 scala 插件在 IntelliJ IDEA 上导致实例崩溃

javascript - 如何使用 JS/jQuery 制作插件/库

html - 用于扩展照片 slider 插件以跨越网页的 CSS 代码

java - 是否可以为 Int 数组中的所有数字赋值?

java - 为什么我应该使用 java 和 php

php - 使用 PHP fastcgi 和 eclipse 配置 Xdebug?

java - Eclipse 在启动时崩溃(eclipse.exe 已停止工作),任何解决方案?