BigDecimal表示法eclipse插件或漂亮的外部工具

我需要使用BigDecimal进行大量操作,我发现必须表达

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

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

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

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

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

PS:我发现这个令人难以置信的智能黑客,但我不想开始进行字节码操作。 也许我可以使用它来创建一个Natural2BigDecimal翻译器,但如果有人已经完成了这样的工具,我不想重新发明轮子。

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

“我不是要尝试预处理源代码……我只想要一些我可以输入的内容[bigDecimal arithmetic expression] text”。

解决问题的一半是认识到问题所在。 您确实需要一些东西来预处理您的BigDecimal表达式以生成合法的Java。

您只有两个基本选择:

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

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

也许(从另一个答案中偷来的):

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

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

要实现第二个想法,您需要一个程序转换系统 ,它可以将源到源重写规则应用于转换(生成转换的特殊情况)代码。 这只是一个预处理器,可根据您的需求进行定制。

我们的DMS软件再造工具包及其Java前端可以做到这一点。 您需要一个完整的Java解析器才能完成转换部分; 您需要名称和类型解析,以便您可以解析/检查建议的表达式是否合理。

虽然我同意Java标记是丑陋的,而你的建议会让它变得更漂亮,但我个人认为这不值得付出努力。 你最终依赖于一个复杂的工具(是的,DMS是复杂的:操纵代码并不容易),因为它获得了相当小的收益。

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

我同意,这非常麻烦! 我使用适当的文档(每个等式前的注释)作为最佳“解决方案”。

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

您可能会去表达式求值程序的路径。 在http://www.singularsys.com/jep上有一个体面的(尽管是付费的)。 Antlr有一个基本的语法,也可以在http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator进行表达式评估(我不知道它会如何表现)。

也不会给你真正的运算符所具有的编译时安全性。 您还可以在Scala中编写各种基于算法的类,它支持运算符重载,并且可以与其他Java类无缝地互操作。