我需要使用BigDecimal进行大量操作,我发现必须表达
Double a = b - c * d; //natural way
作为
BigDecimal a = b.subtract(c.multiply(d))//BigDecimal way
不仅丑陋,而且是我与业务分析师之间的错误和沟通问题的根源。他们完全能够用双打读取代码,但现在他们不能。
当然一个完美的解决方案是java支持运算符重载,但由于这不会发生,我正在寻找一个eclipse插件甚至是一个外部工具,可以自动从“自然方式”转换为“bigdecimal”方式”。
我不试图预处理源代码或动态翻译或任何复杂的事情,我只想要一些我可以输入文本和获取文本,并保持“自然方式”作为评论源代码。
P.S。:我发现this incredible smart hack但我不想开始进行字节码操作。也许我可以用它来创建一个Natural2BigDecimal翻译器,但如果有人已经做过这样的工具,我不想重新发明轮子。
我不想切换到Scala / Groovy / JavaScript,我也不能,公司规则禁止在服务器端代码中使用java。
答案 0 :(得分:1)
“我不是要尝试预处理源代码......我只想要一些我可以输入的内容[bigDecimal arithmetic expression] text。”
解决问题的一半是认识到问题所在。您完全想要预处理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很复杂:操纵代码并不容易),因为它获得了相当小的收益。
如果你和你的团队写了数千个这些公式,或者这些公式的编写者是Java天真的,那么它可能是有意义的。在这种情况下, 我会更进一步,只是坚持你在需要的地方写下标准表达式格式。您可以自定义Java前端以检测操作数类型何时为十进制类型,并为您执行重写。然后,您只需在每个Java编译步骤之前运行此预处理器。
答案 1 :(得分:0)
我同意,这非常麻烦!我使用适当的文档(每个等式前的注释)作为最佳“解决方案”。
// a = b - c * d;
BigDecimal a = b.subtract( c.multiply( d ) )
答案 2 :(得分:0)
您可能会去表达式评估程序的路径。在http://www.singularsys.com/jep有一个体面的(虽然是付费的)。 Antlr有一个基本的语法,也可以在http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator进行表达式评估(因为我不确定它会如何表现)。
两者都不会为您提供真正的运算符所具有的编译时安全性。您还可以在Scala中编写各种基于算法的类,它支持运算符重载,并且可以与其他Java类无缝地互操作。