2011-03-17 77 views
1

最近我重构了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开发工具包提供的工具(即没有第三方库或单独的预处理器)是否有更合适的方法来处理这个问题?

+1

使用宏,并运行C你的代码预处理器=)。 – 2011-03-17 23:51:10

+0

我会像你一样使用'State'对象。 – Gabe 2011-03-17 23:51:40

+0

“跟踪哪个索引对应哪个变量将是相当困难的。” - 对于那种事情总是有最终的int变量。所以它可能并不是那么糟糕,因为如果你眯一下'state [k]'看起来很像'state.k',但显然还是不是首选。 – 2011-03-18 00:03:32

回答

3

选项3,创建您自己的MutableInteger包装类。

struct MutableInteger{ 
    public MutableInteger(int v) { this.value = value;} 
    public int value; 
} 

public void swap3(MutableInteger k, MutableInteger l, MutableInteger m) { 
    int t = m.value; 
    m.value = l.value 
    l.value=k.value; 
    k.value=t; 
} 
+0

+1考虑到我已经写了一大堆Mutable *类,我不知道为什么我没有考虑这个问题。我应该轻轻地(轻轻地)把我的头放在桌子上,让更多的睡眠或更多的咖啡...... – thkala 2011-03-18 00:03:03

+5

强烈建议使用“睡眠”选项。 – 2011-03-18 00:06:05

+5

@Stephen我的睡眠方法抛出'CryingBabyInterruptedException' ;-( – corsiKa 2011-03-18 00:07:55

1

创建一个单独的类例如状态 与适当 类型的公共字段,并使用该作为参数传递给一个 方法

此,而是作为一个中间步骤。然后继续重构 - 理想情况下,州级应该有专用字段。将宏替换为更新此状态的方法。然后与更新状态的方法代替你的代码的所有的休息,直到最后你的程序是这样的:

System.out.println(State(System.in).hexDigest()); 

最后,重命名StateSHA1或任何;-)

+0

+1这肯定会起作用,只要'State'类不是静态的。我猜从C到Java的上下文切换让我有点困惑,因为我设置了哈希方法完全是静态的,没有任何理由...... – thkala 2011-03-18 00:07:25

+0

@thkala:它确实取决于你是否希望Java代码看起来像C代码,例如,如果auth或C代码将在未来进行更改,并且您必须更新Java代码以匹配,那么您可能*不会*希望以更多的OO方式重写它,因为在该特定情况下,它实际上会妨碍维护而不是协助它。但是,如果这是一次性重写,那么肯定会根据需要重构远离原始源。 – 2011-03-18 00:16:00