最近我重构了C++到C的第三方散列函数的代码。这个过程相对来说很轻松,只有很少的变化。现在我想用Java编写相同的函数,并且遇到了一个小问题。Java宏替代C宏
在C/C++代码中有一个C预处理器宏,它将几个整型变量名称作为参数,并用它们的内容和一些常量执行一堆按位运算。这个宏被用在几个不同的地方,因此它的存在避免了一些重复的代码。
但是,在Java中,C预处理器没有等价物。也没有办法影响作为参数传递给方法的任何基本类型 - 即使自动装箱也会产生不可变的对象。再加上Java方法返回单个值的事实,我似乎无法找到重写宏的简单方法。
途径,我认为:
展开用手到处都是宏:它的工作,但代码重复可能让事情变得有趣在从长远来看。
编写返回数组的方法:这也将工作,但它会反复导致成这样的代码:
long tmp[] = bitops(k, l, m, x, y, z); k = tmp[0]; l = tmp[1]; m = tmp[2]; x = tmp[3]; y = tmp[4]; z = tmp[5];
编写需要一个数组作为参数的方法:这意味着所有的变量名都会被简化为数组元素引用 - 跟踪哪个索引对应于哪个变量是很难的。
创建一个单独的类如
State
使用适当类型的公共字段并将其用作方法的参数:这是我当前的解决方案。它允许该方法更改变量,同时保留其名称。然而,它的缺点是State
类会变得越来越复杂,因为会增加更多的宏和变量,以避免在不同的State
对象之间来回复制值。
你会如何在Java中重写这样一个C宏?使用由标准Java 6开发工具包提供的工具(即没有第三方库或单独的预处理器)是否有更合适的方法来处理这个问题?
使用宏,并运行C你的代码预处理器=)。 – 2011-03-17 23:51:10
我会像你一样使用'State'对象。 – Gabe 2011-03-17 23:51:40
“跟踪哪个索引对应哪个变量将是相当困难的。” - 对于那种事情总是有最终的int变量。所以它可能并不是那么糟糕,因为如果你眯一下'state [k]'看起来很像'state.k',但显然还是不是首选。 – 2011-03-18 00:03:32