原始类型引起的代码重复:如何避免疯狂?

10 浏览
0 Comments

原始类型引起的代码重复:如何避免疯狂?

在我的一个Java项目中,由于Java处理原始类型的方式,我被代码重复困扰。在第三次不得不手动复制相同的更改到四个不同位置(int,long,float,double)后,我几乎要崩溃了。

这个问题在StackOverflow上以不同形式时不时地被提出来:

共识似乎趋向于两种可能的替代方案:

  • 使用某种代码生成器。
  • 你能做什么呢?这就是生活!

嗯,我现在正在采用的是第二种解决方案,但它正在慢慢地危及我的理智,就像众所周知的酷刑技术

自从这些问题被提出以来已经过去了两年,Java 7已经出现了。因此,我对更简单和/或更标准的解决方案抱有希望。

  • Java 7是否有任何可能在这种情况下减轻压力的变化?我在简洁的变化摘要中找不到任何信息,但也许有一些隐晦的新功能存在吗?
  • 虽然源代码生成是一种替代方案,但我更希望使用标准JDK功能集来支持解决方案。当然,使用cpp或其他代码生成器是可行的,但它会增加更多依赖并需要对构建系统进行更改。

    JDK唯一支持的类似代码生成系统是通过注解机制。我设想一个处理器可以扩展源代码,如下所示:

    @Primitives({ "int", "long", "float", "double" })
    @PrimitiveVariable
    int max(@PrimitiveVariable int a, @PrimitiveVariable int b) {
        return (a > b)?a:b;
    }
    

    理想的输出文件应包含此方法的四个请求的变体,最好还有相关的Javadoc注释等。是否有注解处理器来处理这种情况?如果没有,构建一个需要什么条件?

  • 也许最近出现了其他的技巧?

编辑:

一个重要的注意事项:除非有理由,否则我不会使用原始类型。即使现在,在某些应用程序中,使用装箱类型仍然会产生非常实际的性能和内存影响。

编辑2:

max()作为示例可以使用所有数值装箱类型中都可用的compareTo()方法。这有点棘手:

int sum(int a, int b) {
    return a + b;
}

如何在不实际写六到七次的情况下支持所有数值装箱类型的此方法?

0