在编译时对Java`int`强加测量单位?

时间:2016-11-14 16:35:25

标签: java primitive units-of-measurement

有没有办法在编译时在Java int上强加“度量单位”的概念,而不是在运行时使用对象引用?

在Java代码中,我想保护开发人员在组合原始数据类型时不要混合度量单位,例如在这个错误中......

int duration1 = 17;    // Number of **seconds**.
int duration2 = 42;    // Number of **minutes**.
int total = duration1 + duration2;    // <== MISTAKE: Mixed units of measure!

最后一行的错误是开发人员在几分钟内增加了几秒钟。因为一切都是int,所以Java编译器不会抱怨这个,所以错误只能通过聪明的单元测试或客户( shudder )来捕获。

编译器有没有办法拒绝这个错误?

为了清楚起见,我不是在寻找运行时单元转换 - 我想要编译时单元检查。

例如,如果可以从int派生(但是不可能),我可以想象像这样的错误代码......

DurationSec duration1 = 17;      // Number of seconds.
DurationMin duration2 = 42;      // Number of minutes.
DurationSec total = duration1 + duration2;    // <== COMPILE ERROR!

在上面的代码中,编译器会抱怨第三行,因为类DurationSec和DurationMin之间没有自动转换,即使这两个类都基于int

第三行可能正确写成(在我的想象中)为......

DurationSec total = duration1 + (DurationSec) (60 * (int) duration2);  // OK

是的,我意识到这可以通过类完成,但我需要int本机数据类型的性能,所以我不想引入对象引用的开销。我只想将int包装在精简的编译时类中。

有什么想法吗?

Java中是否有一个不起眼的新功能可以执行此编译时检查,而不会在代码和运行时添加(或普通)开销?

有没有办法告诉Java优化掉所有对象开销,只处理int

0 个答案:

没有答案